从切片分配到vs.

Ton*_*bda 11 python idioms slice

当读取profile.pypython标准库时,我遇到了赋值语句sys.argv[:] = args,该语句用于修改sys.argv以使正在分析的程序看到正确的命令行参数.我知道这sys.argv = args[:]与实际操作不同,但实际上它们看起来与我相同.是否有人想要使用一个而不是另一个?并且是a[:] = b一个常见的python成语?

更新:在这种特定情况下,为什么选择一个而不是另一个呢?(来源可以在main功能中找到profile.py)

hug*_*gos 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]
Run Code Online (Sandbox Code Playgroud)

  • 举个例子可能会有所帮助.如果`x = [1,2,3]`和`a = x'(所以它们引用相同的列表),执行`a = b [:]`用'b'的副本替换`a`中的_reference_ `; `x`没有变化.另一方面,`a [:] = b`用`b`中的值替换`a`的_contents_(其引用未改变),这意味着`x`也被修改; 参考联系从未被打破过. (3认同)