Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对象引用和深度复制_Python_Python 3.x_Reference - Fatal编程技术网

python对象引用和深度复制

python对象引用和深度复制,python,python-3.x,reference,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) 在这种情况下,字典对象{'hello':'world'}是在内

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

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

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

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

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

关于你的第二个问题,在这个具体的例子中,没有区别

使用:

x = {'test':1}
y = dict(x)
y = copy.deepcopy(x)
创建字典的新副本并将其分配给y

使用:

x = {'test':1}
y = dict(x)
y = copy.deepcopy(x)
创建相同的副本。当字典的值是一个易变对象(如列表)时,您会看到不同之处

这里,y是x的浅拷贝:

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

但是,使用:

x = {'test': [1,2,3]}
y = copy.deepcopy(x)
将创建主对象及其包含的所有对象的副本。因此,现在修改x中的列表不会更改y的值

y不指向x它指向x的数据。。。如果你把x指向别处,y不受它的影响尝试x[hello]=42并计算y.y引用的值与x最初引用的值相同。然后你把x反弹到别的东西上,但这不影响y。您的deepcopy示例并不十分有用,因为使用str或int等不可变类型无法真正看到差异。尝试使用x={'test':[1,2,3]}并尝试操作这些值,您将看到差异。
x['test'][1] = 0
y
# returns
{'test': [1,2,3]}