python对象参考和深层复制

时间:2018-10-21 22:06:02

标签: python python-3.x reference

我突然有点困惑,我现在可能很累,所以这可能是原因。

无论如何,请使用解释器考虑以下内容:

> x = {'hello':'world'}
> y=x

> x= None

>y
y={'hello':'world'}

为什么y = None现在不是y引用相同的值,如x一​​样?

第二个问题:

和有什么不一样?
x= {'test':1}
y = dict(x)
VS  
y = copy.deepcopy(x)

1 个答案:

答案 0 :(得分:1)

在这种情况下,在内存中创建了字典对象{'hello': 'world'},然后分配了x作为对其的引用。分配y=x会为字典对象分配 second 引用,这次是y

但是,y不是指向x的指针的指针。重新分配x不会更改所引用的y


对于第二个问题,在这种情况下,没有区别。

使用:

x = {'test':1}
y = dict(x)

创建字典的新副本,并将其分配给y

使用:

y = copy.deepcopy(x)

创建相同的副本。您会看到的区别是字典的值是一个可变对象,如列表。

在这里,yx的浅表副本:

x = {'test': [1,2,3]}
y = dict(x)

因此,更改x引用的字典对象内部的列表也将出现在y中。

x['test'][1] = 0
y
# returns:
{'test': [1, 0, 2]}

但是,使用:

x = {'test': [1,2,3]}
y = copy.deepcopy(x)

将创建主要对象及其包含的所有对象的副本。因此,现在修改x中的列表将不会更改y的值。

x['test'][1] = 0
y
# returns
{'test': [1,2,3]}