python - Python如何增加列表元素?

标签 python memory

谁能解释一下为什么第一个代码块不会改变列表,而第二个会。

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/

相关文章:

Java:为什么它使用固定数量的内存?或者它如何管理内存?

Python matplotlib 动画重复

python - pyad - 从电子邮件地址获取用户名

python - 如何使用 python/listing docker images 获取 GCR 访问 token

iphone - 内存泄漏问题。仪器显示第 2 行有错误

c++ - 为什么一个代码会产生内存泄漏而另一个不会?

java - 按顺序将 Excel 文件(保存在多个 blob 中)读取到一个 InputStream 中

python - 使用 LXML 仅按属性查询的 CSS 选择器

python - 有没有更有效的方法来编写合并函数?

objective-c - 为什么这个对象释放不正常,我应该释放它吗?