迭代可迭代的列表

时间:2015-05-08 08:39:39

标签: python

我原本期望以下内容:

a = [[1],[2],[3]]
for i in a:
    i = "x"
print(a)

给予:

["x","x","x"]

a实际上保持不变。为什么是这样?我原以为i只是一个指向数组的指针。什么是i?当然,它不是关于循环的第一次迭代的[1]的副本。

2 个答案:

答案 0 :(得分:2)

a = [[1],[2],[3]]
for i in range(0, len(a)-1):
    a[i] = 'X'
print(a)

之所以这样做是因为你选择了#34;"数组中每个对象的副本,作为循环中称为i的独立项。

a = [[1],[2],[3]]
for copiedItem in a:
    copiedItem = 'x' # Replaces your copy that you just picked out from a.

意味着您要更换项目的副本,而不是数组/列表中的实际项目。您需要通过索引a[<index>]来替换,以替换列表中的项目。

另一个例子是:

a = ['moo', 'cow', 'cat']
myCopy = a[0] # Copies 'moo' into 'myCopy'
myCopy = 'THE DEVIL' # Replaces 'moo'.. over your copy..

print(a)
['moo', 'cow', 'cat']

print(myCopy)
'THE DEVIL'

可能是一个糟糕的例子,但它基本上做同样的事情,除了你的for循环是列表对象的迭代生成器,它将每个项返回为一个名为return的异步yield。每个返回的项只是一个副本,而不是对初始对象的引用,因此与仅复制a[0]相同:)

答案 1 :(得分:0)

根据指针思考Python可能会产生误导。相反,你需要学习根据名称绑定的对象进行思考。

所以

for i in a:

将名称i连续绑定到可迭代对象a中的每个对象,在本例中为单个元素列表。

然后

    i = "x"

将文字字符串对象"x"绑定到名称i,该名称覆盖了以前的绑定,因此它对a或其内容没有影响。

请注意

>>> for i in a:
...     i[0] = "x"
... 
>>> print a
[['x'], ['x'], ['x']]

确实做了你可能期望的事情,因为i[0] = "x"正在修改当前绑定到i的列表,它没有将新对象绑定到i

这个主题的优秀指南是SO成员Ned Batchelder的Facts and myths about Python names and values