深拷贝与浅拷贝的核心区别在于是否递归复制嵌套可变对象:浅拷贝仅新建外层容器,内部仍共享;深拷贝则完全独立。常用浅拷贝方式有copy.copy()、内置.copy()方法、切片[:]和类型构造器;深拷贝唯一推荐copy.deepcopy(),适用于需隔离嵌套修改的场景。

Python 中对象的深拷贝和浅拷贝,核心区别在于:是否递归复制嵌套的可变对象。简单说,浅拷贝只新建外层容器,内部仍共用原对象;深拷贝则从里到外全新建,彼此完全独立。
浅拷贝的常用实现方式
适用于不需要隔离嵌套结构、追求效率的场景:
- 用 copy.copy():通用,支持任意类型,返回同类型实例(比如子类对象拷贝后仍是子类)
- 用内置类型的 .copy() 方法:如
my_list.copy()、my_dict.copy()、my_set.copy() - 用切片 [:]:仅限序列类型(列表、字节串等),
new = old[:]是最简洁写法 - 用类型构造器:如
list(old)、dict(old)、set(old),但注意可能降级为基类(如子类列表会变成普通 list)
深拷贝的标准实现方式
当对象含嵌套列表、字典、自定义类实例等可变子项,且必须彻底隔离修改影响时使用:
- 唯一推荐方式是 copy.deepcopy():自动处理嵌套、循环引用、用户自定义类(若实现了
__deepcopy__) - 不建议手动递归实现:易出错、难覆盖边界情况(如递归对象、不可序列化对象)
- 注意性能开销:深拷贝会遍历全部层级,大数据或深层嵌套时明显变慢
关键判断:什么时候该用深拷贝?
看是否涉及“嵌套可变对象”的修改操作:
- 如果只是改外层元素(如列表首项赋值、字典新增键),浅拷贝足够安全
- 如果要改内层内容(如
data[0].append(x)或data['cfg']['timeout'] = 30),且不希望影响原对象 → 必须深拷贝 - 函数接收可变对象参数并可能修改它?建议在函数内部用
deepcopy做防御性拷贝,避免副作用
自定义类的拷贝行为
若需精细控制拷贝逻辑(例如忽略某些字段、延迟加载、共享缓存),可在类中定义:
-
__copy__(self):被
copy.copy()调用,返回浅拷贝结果 -
__deepcopy__(self, memo):被
copy.deepcopy()调用,memo用于跟踪已拷贝对象,防止循环引用死循环

















