当阅读python标准库的profile.py
时,我遇到了赋值语句sys.argv[:] = args
,它用于修改sys.argv
以使正在分析的程序看到正确的命令行参数。我理解这与实际操作中的sys.argv = args[:]
不同,但实际上它们看起来与我相同。是否有人想要使用一个而不是另一个? a[:] = b
是一个常见的蟒蛇成语吗?
更新:在这种特定情况下,为什么选择一个而不是另一个呢? (来源可以在main
)的profile.py
函数中找到
答案 0 :(得分:9)
不同之处在于,当您使用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]