内置类型的问题——赋值创建引用,而非拷贝

未匹配的标注

因为这是一个如此中心的概念,我就再提一次:程序中对可变对象的共享引用会很重要。比如,在下面例子中,被分配给变量名 L 的列表对象被 L 和被分配给变量名 M 的列表的内部同时引用。就地改变L也会改变M引用的内容:

>>> L = [1, 2, 3]
>>> M = ['X', L, 'Y'] # Embed a reference to L
>>> M
['X', [1, 2, 3], 'Y']
>>> L[1] = 0 # Changes M too
>>> M
['X', [1, 0, 3], 'Y']

这个效果通常只有在更大的程序中才会变得重要,且共享引用通常就是你想要的。如果对象在你使用它们的时候以不想要的方式发生了改变,可以通过明确地拷贝他们来避免共享对象。对于列表,总是可以通过使用空限制切片(之前描述过的其它技术之一)来创建一个顶层的拷贝:

>>> L = [1, 2, 3]
>>> M = ['X', L[:], 'Y'] # Embed a copy of L (or list(L), or L.copy())
>>> L[1] = 0 # Changes only L, not M
>>> L
[1, 0, 3]
>>> M
['X', [1, 2, 3], 'Y']

记住:切片限制默认为0和被切片序列的长度;如果开头和末尾都省略,切片会提取序列中的每一项,因此创建了一个顶层的拷贝(一个新的,未共享的对象)。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~