Python中列表的内存管理

4

我似乎无法理解Python中的以下行为:

x = [0, [1,2,3,4,5],[6]]
y = list(x)
y[0] = 10
y[2][0] = 7
print x
print y

它输出:

[0, [1, 2, 3, 4, 5], [7]]
[10, [1, 2, 3, 4, 5], [7]]

为什么x和y的第二个索引被更新,而只有y的第一个索引被更新?

1
啊,浅复制和整数的驻留。 - inspectorG4dget
2个回答

6
这是因为list(x)创建了列表x浅层副本x中的一些元素本身就是列表。对于它们不会创建副本,而是作为引用传递。这样,xy最终都引用同一个列表作为元素。
如果您想创建深层副本(即同时复制子列表),请使用:
import copy
y = copy.deepcopy(x)

0
在Python中,序列被分为可变序列和不可变序列。可变序列可以在创建后更改,而不可变序列则不能。对于不可变序列(如字符串、Unicode和元组),Python会为它们创建一个副本。对于可变序列(如列表和字节数组),Python会创建一个引用。
因此,如果您更改x,则y也将随之更改,因为它们都引用同一个列表。 标准类型层次结构

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接