浅拷贝仅复制对象第一层,嵌套可变对象仍共享引用;深拷贝递归复制所有层级,完全独立。不可变对象无需拷贝,自定义类可通过__copy__和__deepcopy__方法控制行为。

浅拷贝只复制对象的第一层,内部嵌套的对象仍共享引用;深拷贝则递归复制所有层级,完全独立不共享。
浅拷贝:新对象,但嵌套内容共用
浅拷贝创建一个新对象,但该对象中包含的可变子对象(如列表、字典、自定义类实例)仍指向原对象中的同一内存地址。修改嵌套内容会影响原对象。
- 常用方式:
copy.copy()、切片[:]、list()、dict.copy()等 - 适合场景:对象结构扁平,或明确知道不会修改嵌套部分
- 例子:a = [[1, 2], 3]; b = copy.copy(a); b[0].append(4) → a 变成 [[1, 2, 4], 3]
深拷贝:彻底隔离,互不影响
深拷贝递归遍历整个对象结构,为每一层的可变对象都分配新内存,确保新旧对象完全独立。耗时略长,内存开销更大。
- 唯一标准方式:
copy.deepcopy() - 适合场景:含多层嵌套(如列表中套字典再套列表)、需完全隔离修改的场合
- 注意:不可序列化的对象(如文件句柄、线程锁)无法深拷贝,会报
TypeError
哪些类型不需要拷贝?
不可变对象(int、str、tuple、None等)在赋值或浅拷贝时,本质是引用其本身,但因不可修改,无需担心副作用。
立即学习“Python免费学习笔记(深入)”;
- 例如:
x = (1, 2); y = copy.copy(x),x 和 y 实际指向同一元组对象,但安全 - 真正需关注的是含可变对象的容器(list、dict、set、自定义类)
自定义类如何控制拷贝行为?
可通过实现特殊方法定制拷贝逻辑:
-
__copy__(self):被copy.copy()调用,返回浅拷贝结果 -
__deepcopy__(self, memo):被copy.deepcopy()调用,memo用于处理循环引用 - 若未定义,
copy模块按默认规则处理(逐属性拷贝)










