谁能解释一下为什么第一个代码块不会改变列表,而第二个会。
a = [1,2,3]
for el in a:
el += 5
这会将 a
保留为 [1,2,3]
。也就是说,如果我运行
a = [1,2,3]
for i in range(len(a)):
a[i] += 5
然后 a = [6,7,8]
。我的猜测是,首先,当循环遍历元素时 el
是一个临时变量,而不是实际上引用列表中该元素的东西。不知道为什么增加它不会影响列表。
最佳答案
Python 整数是不可变的,但列表是可变的。
在第一种情况下,el
引用了不可变的整数,因此 +=
创建了一个只有 el
引用的新整数。
在第二种情况下,列表 a
直接发生变异,直接修改其元素。 a[0]
仍然引用一个不可变整数,因此 +=
创建一个新整数,但它的引用被直接分配给可变列表的一个元素。
示例
以下示例显示了列表元素的引用 ID。在第一种情况下,创建了新的整数,但原始列表引用保持不变。
a = [1,2,3]
print [id(x) for x in a]
print a
for el in a:
el += 5 # creates new integer, but only temp name references it
print [id(x) for x in a] # references are not changed.
print a
输出
[36615248, 36615236, 36615224]
[1, 2, 3]
[36615248, 36615236, 36615224]
[1, 2, 3]
在第二种情况下,列表引用被更新:
a = [1,2,3]
print [id(x) for x in a]
print a
for i in range(len(a)):
a[i] += 5 # creates new integer, but updates mutable list
print [id(x) for x in a] # references are changed.
print a
输出
[36615248, 36615236, 36615224]
[1, 2, 3]
[36615188, 36615176, 36615164]
[6, 7, 8]
关于python - Python如何增加列表元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42749644/