python - 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)
解决方案
在这种情况下,字典对象{'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]}
推荐阅读
- fullcalendar - fullcalendar.io 可以在 .net core Blazor 中使用吗?
- java - 如果我需要第二次读取版本,为什么要使用可重复读取(或更高)隔离级别?
- automake - 不同平台之间aclocal版本不匹配的问题
- php - 使用 PHP 通过 SFTP 上传图片正在上传 0 字节文件
- python - 我想找到一个位于 a 内的标签
包含多个标签的标签并获取其中的文本
- excel - 滚动 3 本年度和上一年同期合计
- laravel - PHPUnit 功能测试中的覆盖类
- c++ - 写访问冲突 this->head 在 pop_front 中是 0xDDDDDDDD
- ios - 在表格视图中控制“程序流程”
- python - 读取json、解析成data、json.dumps(data)后json无效