我原本期望以下内容:
a = [[1],[2],[3]]
for i in a:
i = "x"
print(a)
给予:
["x","x","x"]
但a
实际上保持不变。为什么是这样?我原以为i
只是一个指向数组的指针。什么是i
?当然,它不是关于循环的第一次迭代的[1]的副本。
答案 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。