python - 可变和不可变 Deep/Shallow 复制 Python
问题描述
我有一个关于 Python 如何管理深拷贝和浅拷贝的问题。
从我读到的:
- 浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中找到的对象。
- 深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。
如果你这样做:
a = list()
b = a
a.append(1)
print(b)
它将显示 b = [1]。如果我更改 b,它将修改 a。如果我更改 a 它会修改 b,因为它们都指向同一个列表...(对吗?)
那么,如果我理解正确,这是否意味着 Python 使用列表管理浅拷贝?这
b = a
是浅拷贝吗??浅/深副本是否取决于类的可变性(可变/不可变)?
先感谢您。
解决方案
从文档:
- 浅拷贝构造一个新的复合对象,然后(在可能的范围内)将对原始对象中的对象的引用插入其中。
- 深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。
此交互式会话可能会帮助您弄清楚浅拷贝和深拷贝之间的区别:
In [91]: import copy
In [92]: z = [100, -1]
In [93]: a = [1, 2, z]
In [94]: b = a
In [95]: c = copy.copy(a)
In [96]: d = copy.deepcopy(a)
In [97]: a[0] = 99
In [98]: z[-1] = 0
In [99]: a
Out[99]: [99, 2, [100, 0]]
In [100]: b
Out[100]: [99, 2, [100, 0]]
In [101]: c
Out[101]: [1, 2, [100, 0]]
In [102]: d
Out[102]: [1, 2, [100, -1]]
请注意,分配b = a
不会创建 引用的列表的副本a
,它只是将新名称绑定b
到该列表。
内存中对象的图形表示可以让您进一步了解这些概念。
推荐阅读
- python - 处理 Nonetype 以设置路径
- javascript - 如何阻止外部脚本网址
- sql - ORACLE DB 的 MIN 和 DISTINCT
- c++ - 静态函数中对静态变量的未定义引用
- command-line-interface - 使用 ngrok 的 502 错误网关
- batch-file - 通过右键单击批处理文件提取多个 Rar/Zip 文件
- python - 在 Python 中使用一个行列表推导从一个列表中获取两个列表
- c++ - C++ 数组中的 C6385 和 C6201 警告
- php - LARAVEL::如何在另一个刀片页面上显示请求的日期范围
- excel - 重命名形状组-小问题