【问题标题】:Assigning to vs. from a slice从切片分配给 vs.
【发布时间】:2016-01-15 21:45:06
【问题描述】:

在阅读 python 标准库的profile.py 时,我遇到了赋值语句sys.argv[:] = args,它用于修改sys.argv 以使正在分析的程序看到正确的命令行参数。我知道这在实际操作中与sys.argv = args[:] 不同,但实际上在我看来是一样的。是否存在一个人想使用一个而不是另一个的情况?而a[:] = b是python的常用习语吗?

更新:在这种特定情况下,为什么要选择一个而不是另一个? (源码可以在profile.pymain函数中找到)

【问题讨论】:

    标签: python slice idioms


    【解决方案1】:

    不同之处在于,当您使用a[:] = b 时,这意味着您将覆盖a 上已有的内容。如果您有其他引用 a 的内容,它也会更改,因为它一直引用相同的位置。

    另一方面,a = b[:] 创建一个新引用并将 b 中的所有值复制到此新引用。因此,对旧数据的现有引用将继续指向旧数据。

    考虑这个例子:

    >>> a = [1, 2, 3]
    >>> b = [4, 5, 6]
    >>> c = a # c is a reference to the list in a
    >>> c
    [1, 2, 3]
    >>> 
    >>> a[:] = b
    >>> a # a will have a copy of the list in b
    [4, 5, 6] 
    >>> c # and c will keep having the same value as a
    [4, 5, 6]
    >>>
    >>> b = [7, 8, 9]
    >>> a = b[:]
    >>> a # a has the new value
    [7, 8, 9]
    >>> c # c keeps having the old value
    [4, 5, 6]
    

    【讨论】:

    • 谢谢,我意识到如果有其他对a的引用,这会有所不同
    • 举个例子可能会有所帮助。如果x = [1, 2, 3]a = x(因此它们引用相同的列表),则执行a = b[:] 会将a 中的reference 替换为b 的副本; x 不变。另一方面,a[:] = ba(其引用不变)的内容替换为b中的值,这意味着x也被修改了;参考链接从未中断。
    • 我进行了编辑以添加更多详细信息。但是一个例子应该是一件好事。我会添加它。
    • @TonyBetaLambda 该示例是否使其更清晰?您还有什么需要了解的吗?
    • 以这种方式重新分配sys.path 基本上是没有意义的,但是如果您需要重新分配作为参数传递给函数的list 的内容(修改调用者的副本),则该习惯用法很有用。只有a[:] = b 会改变调用者(其中a 是一个函数参数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2018-01-31
    • 2020-01-29
    • 1970-01-01
    • 2022-08-09
    • 2019-01-05
    • 2018-07-14
    相关资源
    最近更新 更多