源代码:
Lib/copy.py
Python 的赋值语句不复制对象,而是创建目标和对象的绑定关系。对于自身可变,或包含可变项的集合,有时要生成副本用于改变操作,而不必改变原始对象。本模块提供了通用的浅层复制和深层复制操作,(如下所述)。
接口摘要:
copy.
copy
(
x
)
返回
x
的浅复制。
浅层复制
构造一个新的复合对象,然后(在尽可能的范围内)将原始对象中找到的对象的
引用
插入其中。
深层复制
构造一个新的复合对象,然后,递归地将在原始对象里找到的对象的
副本
插入其中。
深度复制操作通常存在两个问题, 而浅层复制操作并不存在这些问题:
递归对象 (直接或间接包含对自身引用的复合对象) 可能会导致递归循环。
由于深层复制会复制所有内容,因此可能会过多复制(例如本应该在副本之间共享的数据)。
deepcopy()
函数用以下方式避免了这些问题:
保留在当前复制过程中已复制的对象的 "备忘录" (
memo
) 字典;以及
允许用户定义的类重写复制操作或复制的组件集合。
此模块不会复制模块、方法、栈追踪、栈帧、文件、套接字、窗口以及任何相似的类型。 它会通过不加修改地返回原始对象来(浅层或深层地)“复制”函数和类;这与
pickle
模块处理这类问题的方式是兼容的。
制作字典的浅层复制可以使用
dict.copy()
方法,而制作列表的浅层复制可以通过赋值整个列表的切片完成,例如,
copied_list
=
original_list[:]
。
类可以使用与控制序列化(pickling)操作相同的接口来控制复制操作,关于这些方法的描述信息请参考
pickle
模块。实际上,
copy
模块使用的正是从
copyreg
模块中注册的 pickle 函数。
为了让一个类定义其自己的复制实现,它可以定义特殊方法
__copy__()
和
__deepcopy__()
。 前者用于实现浅复制操作,后者用于实现深复制操作,它接受一个参数,即
memo
字典。 如果
__deepcopy__()
实现需要对某个组件进行深复制,它应该调用
deepcopy()
函数,组件作为第一个参数,memo 字典作为第二个参数。 memo 字典应被视为不透明对象。
模块
pickle
讨论了支持对象状态检索和恢复的特殊方法。
2001-2024, Python Software Foundation.
This page is licensed under the Python Software Foundation License Version 2.
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
See
History and License
for more information.