You are here:  Home » Python » copy-浅层和深层复制操作(39)Python语言(必读进阶学习教程)(参考资料)

Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。该模块提供了通用的浅层和深层复制操作(如下所述)。

接口摘要:

copy.copy
返回x的浅表副本。
copy.deepcopy[备忘录
返回x的深层副本。
异常copy.error
针对模块特定错误引发。

浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:

  • 浅拷贝构造新化合物对象,然后(在可能的范围)插入引用到它在原始找到的对象。
  • 深层副本构造新化合物的对象,然后,递归地,插入 拷贝到它在原始找到的对象的。

深拷贝操作通常存在两个问题,这些问题在浅拷贝操作中不存在:

  • 递归对象(直接或间接包含对自身的引用的复合对象)可能会导致递归循环。
  • 因为深拷贝会复制它可能复制的所有内容,例如要在副本之间共享的数据。

deepcopy()功能通过以下方式避免了这些问题

  • 保存memo当前复制过程中已经复制的对象的字典; 和
  • 让用户定义的类覆盖复制操作或复制的组件集。

此模块不复制类型,如模块,方法,堆栈跟踪,堆栈帧,文件,套接字,窗口,数组或任何类似类型。它通过返回原始对象来“复制”函数和类(浅和深); 这与pickle模块处理这些方式兼容。

例如,可以dict.copy()通过分配整个列表的切片来使用字典的浅层副本和列表 。copied_list =original_list[:]

类可以使用相同的接口来控制用于控制酸洗的复制。有关pickle这些方法的信息,请参阅模块的说明。实际上,该copy模块使用模块中注册的pickle函数copyreg

为了让类定义自己的副本实现,它可以定义特殊的方法__copy__()__deepcopy__()。前者被称为实现浅拷贝操作; 没有传递其他参数。调用后者来实现深拷贝操作; 它传递了一个参数,memo字典。如果__deepcopy__()实现需要对组件进行深层复制,则应该deepcopy()以组件作为第一个参数并将备注字典作为第二个参数来调用该函数。

也可以看看

模 pickle
讨论用于支持对象状态检索和恢复的特殊方法。