首页 > 解决方案 > python对象引用和深拷贝

问题描述

我突然有点迷茫,我现在可能累了,所以这可能是原因。

无论如何考虑以下使用解释器:

> 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)

标签: pythonpython-3.xreference

解决方案


在这种情况下,字典对象{'hello': 'world'}是在内存中创建的,然后x被分配为对它的引用。分配y=x第二个引用分配给字典对象,这次是y.

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


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

使用:

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

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

使用:

y = copy.deepcopy(x)

创建一个相同的副本。当字典的值是一个可变对象(如列表)时,您会看到不同之处。

这里,y是一个浅拷贝x

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

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

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

但是,使用:

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

将创建主对象以及它包含的所有对象的副本。所以现在修改列表x不会改变y.

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

推荐阅读