我一直在观察这种奇怪的行为。现在我想知道原因。
请参阅下面的示例。
有人可以解释为什么 - 以及是否有其他选项更类似于第一个版本执行第二个版本的操作。
>>> a
>>> [1, 0, 1, 1]
>>> for el in a:
el = 1
>>> a
>>> [1, 0, 1, 1]
>>> for i in range(len(a)):
a[i] = 1
>>> a
>>> [1, 1, 1, 1]
答案 0 :(得分:3)
您的第一个片段:
for el in a:
仅获取a
中项目的值,它们不会引用列表中的项。因此,当您尝试重新分配时,您只需更改el
的值,而不是列表中的项目。
虽然这个:
a[i]
检索a
本身的项目,而不仅仅是值。
要更改a
的所有值,您可以创建新副本并将其重新分配回a
:
a = [1 for _ in a]
这是最有效的方法。如果您想同时使用值和索引来重新分配它,请使用enumerate
:
for index, el in enumerate(a):
print el #print the current value
a[index] = 1 #change it,
print el #and print the new one!
希望这有帮助!
答案 1 :(得分:1)
我通常最终会使用这样的东西:
a = [1 for el in a]
列表理解是我更新列表中避免索引的项目的首选方法。
答案 2 :(得分:0)
Pythons变量是对象的名称,而不是内存中位置的名称。因此
el = 1
不会更改对象el
指向1
。相反,它使el
现在指向对象1
。它根本不会修改列表中的任何内容。为此,您必须直接修改列表:
a[2] = 1
答案 3 :(得分:0)
快速枚举给出了元素的不可变副本,因此速度优于索引迭代方法。
for el in a:# el is immutable
其中
for i in range(len(a)):
a[i] = 1
修改其内存位置的值,因为listname[<index>]
实际为baseaddress+index*offset
。索引以零开始的原因之一