分配给 vs. 来自切片

Assigning to vs. from a slice

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

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

不同之处在于,当您使用 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]