我本以为会有以下情况:
a = [[1],[2],[3]]
for i in a:
i = "x"
print(a)给予:
["x","x","x"]但是a实际上保持不变。为什么会这样呢?我认为i只是一个指向数组的指针。i是什么?当然,对于循环的第一次迭代,它不是1的副本。
发布于 2015-05-08 08:40:42
a = [[1],[2],[3]]
for i in range(0, len(a)-1):
a[i] = 'X'
print(a)之所以如此,是因为您正在“选择”数组中每个对象的副本,作为循环中称为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] :)是一回事。)
发布于 2015-05-08 09:00:35
从指针的角度考虑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。
关于这个主题的一个很好的指南是Ned的关于Python名称和值的事实和神话。
https://stackoverflow.com/questions/30119401
复制相似问题