copy-浅层和深层复制操作(39)Python语言(必读进阶学习教程)(参考资料)
Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。该模块提供了通用的浅层和深层复制操作(如下所述)。
接口摘要:
copy.
copy
(x )- 返回x的浅表副本。
copy.
deepcopy
(x [,备忘录] )- 返回x的深层副本。
- 异常
copy.
error
- 针对模块特定错误引发。
浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:
- 甲浅拷贝构造新化合物对象,然后(在可能的范围)插入引用到它在原始找到的对象。
- 甲深层副本构造新化合物的对象,然后,递归地,插入 拷贝到它在原始找到的对象的。
深拷贝操作通常存在两个问题,这些问题在浅拷贝操作中不存在:
- 递归对象(直接或间接包含对自身的引用的复合对象)可能会导致递归循环。
- 因为深拷贝会复制它可能复制的所有内容,例如要在副本之间共享的数据。
该deepcopy()
功能通过以下方式避免了这些问题
- 保存
memo
当前复制过程中已经复制的对象的字典; 和 - 让用户定义的类覆盖复制操作或复制的组件集。
此模块不复制类型,如模块,方法,堆栈跟踪,堆栈帧,文件,套接字,窗口,数组或任何类似类型。它通过返回原始对象来“复制”函数和类(浅和深); 这与pickle
模块处理这些方式兼容。
例如,可以dict.copy()
通过分配整个列表的切片来使用字典的浅层副本和列表 。copied_list =original_list[:]
类可以使用相同的接口来控制用于控制酸洗的复制。有关pickle
这些方法的信息,请参阅模块的说明。实际上,该copy
模块使用模块中注册的pickle函数copyreg
。
为了让类定义自己的副本实现,它可以定义特殊的方法__copy__()
和__deepcopy__()
。前者被称为实现浅拷贝操作; 没有传递其他参数。调用后者来实现深拷贝操作; 它传递了一个参数,memo
字典。如果__deepcopy__()
实现需要对组件进行深层复制,则应该deepcopy()
以组件作为第一个参数并将备注字典作为第二个参数来调用该函数。
也可以看看
- 模
pickle
- 讨论用于支持对象状态检索和恢复的特殊方法。