[英]Python: Changing Elements in List
我观察这种奇怪的行为已有一段时间了。 现在我想知道原因。
请参见下面的示例。
有人可以解释原因-以及是否还有其他选项与第一个版本更相似,而第二个版本却可以完成。
>>> 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]
您的第一个片段:
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!
希望这可以帮助!
我通常最终使用这样的东西:
a = [1 for el in a]
列表理解是我更新列表中避免索引的项目的首选方式。
Pythons变量是对象的名称,而不是内存中位置的名称。 于是
el = 1
不更改el
指向的对象为1
。 相反,它现在使el
指向对象1
。 它根本不会修改列表中的任何内容。 为此,您必须直接修改列表:
a[2] = 1
快速枚举给出了元素的不变副本,因此在速度上优于索引迭代方法。
for el in a:# el is immutable
在哪里
for i in range(len(a)):
a[i] = 1
修改其内存位置的值,因为listname[<index>]
实际上是baseaddress+index*offset
。 索引从零开始的原因之一
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.