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

更新:在这种特定情况下,为什么一个会选择另一个呢? (可在mainprofile.py函数中找到源)

最佳答案

区别在于,当您使用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]

关于python - 从切片分配给vs.,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33182333/

10-09 20:21
查看更多