分配给 vs. 来自切片
Assigning to vs. from a slice
在阅读 python 标准库的 profile.py
时,我遇到了赋值语句 sys.argv[:] = args
,它用于修改 sys.argv
以使正在分析的程序看到正确的命令行参数。我知道这在实际操作中与sys.argv = args[:]
不同,但实际上它们对我来说看起来是一样的。是否存在一个人想使用一个而不是另一个的情况? a[:] = b
是一个常见的 python 习语吗?
更新:在这种特定情况下,为什么要选择一个而不是另一个? (来源可以在profile.py
的main
函数中找到)
不同之处在于,当您使用 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 标准库的 profile.py
时,我遇到了赋值语句 sys.argv[:] = args
,它用于修改 sys.argv
以使正在分析的程序看到正确的命令行参数。我知道这在实际操作中与sys.argv = args[:]
不同,但实际上它们对我来说看起来是一样的。是否存在一个人想使用一个而不是另一个的情况? a[:] = b
是一个常见的 python 习语吗?
更新:在这种特定情况下,为什么要选择一个而不是另一个? (来源可以在profile.py
的main
函数中找到)
不同之处在于,当您使用 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]