Python对象拷贝分浅拷贝和深拷贝:浅拷贝只复制顶层,嵌套对象仍共享引用;深拷贝递归复制所有层级,完全独立。=赋值仅为引用,不产生新对象。

Python中对象拷贝不是简单的“复制一份”,而是分浅拷贝(shallow copy)和深拷贝(deep copy),关键看是否递归复制嵌套对象。直接用=只是赋新引用,原对象改了,新变量也跟着变。
浅拷贝:只复制顶层,嵌套对象仍共享
浅拷贝创建一个新对象,但内部可变对象(如列表里的子列表、字典里的值)仍是原对象的引用。修改嵌套内容会影响原对象。
- 适用场景:对象结构扁平,或你明确希望内层共享;比如临时备份配置字典,但其中的缓存列表本就该共用
-
常用方法:
copy.copy(obj)-
obj.copy()(仅对dict、list、set等内置类型有效) -
obj[:](仅限列表切片) -
list(obj)、dict(obj)等构造函数
深拷贝:完全独立,递归复制所有层级
深拷贝会递归遍历整个对象树,为每个子对象都创建新副本。修改拷贝后的任意层级,都不会影响原始对象。
- 适用场景:对象含多层嵌套(如列表里有字典,字典里又有列表),且需要彻底隔离;比如做实验性数据处理、回滚前快照
-
注意点:
- 性能开销大,尤其对象庞大或存在循环引用时
- 某些对象无法深拷贝(如打开的文件、线程锁、lambda函数),会抛
TypeError - 使用
copy.deepcopy(obj)即可,无需额外参数(除非自定义__deepcopy__)
如何判断该用哪种?看“改了会不会互相影响”
动手前快速验证:修改拷贝体的某一层,再检查原对象对应位置是否变化。
立即学习“Python免费学习笔记(深入)”;
- 如果只改最外层(如列表追加元素),原对象不变 → 浅拷贝已够用
- 如果改了内层(如
copied_list[0].append(99)),原对象original_list[0]也多了99 → 必须用深拷贝 - 不确定结构深度?保守起见用
deepcopy,但记得加注释说明原因
自定义类支持拷贝:实现__copy__和__deepcopy__
默认情况下,copy.copy和deepcopy对自定义类会尝试调用这两个特殊方法。不实现则按默认逻辑(浅拷贝字段、深拷贝字段值)。
-
__copy__(self)接收一个memo字典(深拷贝用),返回新实例,通常手动复制各字段 -
__deepcopy__(self, memo)需显式调用copy.deepcopy(value, memo)处理每个字段,避免无限递归 - 常见模式:用
__dict__.copy()做浅拷贝基础,再逐个处理需深拷贝的属性










