我正在使用Python 3.4。
我注意到了这个有趣的行为:
In [1]: a=[1,2,3,4,5,6,7,8,9]
In [2]: b=[10,11,12,13,14,15,16,17,18,19]
In [3]: type(a)
Out[3]: list
In [4]: a
Out[4]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [5]: b
Out[5]: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
In [6]: c=a
In [7]: c
Out[7]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [8]: c.extend(b)
In [9]: c
Out[9]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
In [10]: a
Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
为什么在应用于c
的extend
方法中修改了a
?
你是否观察到了相同的行为?
这是正常的吗?在这种情况下,我如何扩展c
而不改变a
?
In [6]: c=a
中,你没有复制列表,而是将c
设置为引用a
引用的相同列表。你可以通过执行id(a)
和id(c)
来验证。 - Akavallc=a
的意思是c
是指向与a
相同的列表的引用。如果您修改该列表,则无论您将其称为什么,您都将看到该修改。list(a)
会复制a
所引用的列表。因此,如果您写c=list(a)
,则c
和a
将引用具有相同内容的 不同 列表(直到您修改其中一个为止)。 - Eric Appeltc
分配给与a
指向的同一内存地址。我讨厌很多Python开发人员对说,“哦,但是Python中不存在指针,所以这是技术上错误的。”事实上,使用指针作为类比是向新手直观地解释概念的好方法。技术上正确并不总是转化为有帮助。 - Dave Liu