在线文档教程

copy

copy — Shallow and deep copy operations

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

接口总结:

copy.copy(x)

返回x的浅表副本。

copy.deepcopy(x)

返回x的深层副本。

exception copy.error

引发模块特定的错误。

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

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

  • 深层副本构造新化合物的对象,然后,递归地,插入拷贝到它在原始找到的对象的。

对于浅拷贝操作不存在的深拷贝操作常常存在两个问题:

  • 递归对象(直接或间接包含对自身的引用的复合对象)可能会导致递归循环。

  • 由于深拷贝复制了可能拷贝太多的所有内容,例如甚至应该在拷贝之间共享的管理数据结构。

The deepcopy() function avoids these problems by:

  • 保留在当前复制过程中已经复制的对象的“备忘录”字典; 和

  • 让用户定义的类覆盖复制操作或复制的组件集合。

这个模块不会复制像模块,方法,堆栈跟踪,堆栈框架,文件,套接字,窗口,数组或类似类型的类型。它通过不变地返回原始对象来“复制”函数和类(浅而深)这与这些pickle模块处理的方式是一致的。

例如,可以dict.copy()通过分配整个列表的一部分来制作浅表副本copied_list = original_list[:]

在版本2.5中更改:添加了复制功能。

类可以使用相同的接口来控制他们用来控制酸洗的复制。有关pickle这些方法的信息,请参阅模块的说明。该copy模块不使用copy_reg注册模块。

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