Python中列表的内存管理

时间:2016-02-02 16:47:54

标签: python python-2.7 memory-management

我似乎无法理解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的第一个索引?

2 个答案:

答案 0 :(得分:6)

这是因为list(x)创建了列表x副本。 x中的一些元素是列表本身。没有为他们创建副本;它们作为参考传递。这样,xy最终会将相同的列表引用为元素。

如果要创建x的深层副本(即同时复制子列表),请使用:

import copy
y = copy.deepcopy(x)

答案 1 :(得分:0)

在Python中,序列被分为可变序列,可以在创建之后进行更改,以及不可变序列。对于不可变序列(字符串,Unicode,元组),Python为它们制作副本。对于可变序列(列表, Byte Arrays),Python为它们提供了参考。

因此,如果您更改x,则y也会更改,因为它们具有对同一列表的引用。

The standard type hierarchy