【发布时间】:2012-04-20 17:55:41
【问题描述】:
我有一个这样的列表
a = [ [ 1,2,3 ], [ 4,5,6] ]
如果我写
for x in a:
do something with x
a 中的第一个列表是否已复制到 x?或者 python 是否使用迭代器而不做任何额外的复制来做到这一点?
【问题讨论】:
标签: python list iteration name-binding
我有一个这样的列表
a = [ [ 1,2,3 ], [ 4,5,6] ]
如果我写
for x in a:
do something with x
a 中的第一个列表是否已复制到 x?或者 python 是否使用迭代器而不做任何额外的复制来做到这一点?
【问题讨论】:
标签: python list iteration name-binding
Python 不会将项目从 a 复制到 x。它只是将 a 的第一个元素称为 x。也就是说:修改x的同时,也修改了a的元素。
这是一个例子:
>>> a = [ [ 1,2,3 ], [ 4,5,6] ]
>>> for x in a:
... x.append(5)
...
>>> a
[[1, 2, 3, 5], [4, 5, 6, 5]]
【讨论】:
x 不是副本是分开的——如果你要做x = a[1],它也不会复制。
首先,这些是可变列表[1, 2, 3],而不是不可变元组(1, 2, 3)。
其次,答案是它们不是复制而是通过引用传递的。因此,对于可变列表的情况,如果您在示例中更改 x 的值,a 也将被修改。
【讨论】:
x = 3 不会修改 a。
for element in aList: 执行以下操作:它创建一个名为element 的标签,该标签引用列表的第一项,然后是第二项……直到它到达最后一项。它不会复制列表中的项目。
写x.append(5) 将修改项目。写入x = [4, 5, 6] 只会将x 标签重新绑定到新对象,因此不会影响a。
【讨论】: