浅拷贝只复制对象第一层引用,嵌套可变对象仍共享内存;深拷贝递归复制整个对象树,完全隔离。常用浅拷贝方法有copy.copy()、切片等,深拷贝唯一标准是copy.deepcopy()。

Python中浅拷贝只复制对象的第一层引用,深拷贝则递归复制整个对象树,包括所有嵌套的可变对象。
浅拷贝:共享内层对象
浅拷贝创建新对象,但其中包含的可变元素(如列表、字典、自定义类实例)仍指向原对象的同一内存地址。修改嵌套的可变对象会影响原对象和拷贝对象。
- 常用方法:
copy.copy()、切片[:]、list()、dict.copy() - 适用于仅含不可变元素(如数字、字符串、元组)的对象,或明确不需要隔离嵌套结构的场景
- 例如:
a = [[1, 2], 3]; b = a.copy(); b[0].append(4)→a也变成[[1, 2, 4], 3]
深拷贝:完全独立副本
深拷贝递归遍历对象及其所有嵌套层级,为每个可变子对象分配新内存,确保原对象与拷贝对象彻底隔离。
- 唯一标准方式:
copy.deepcopy() - 会跳过不可哈希的循环引用(自动缓存已处理对象,避免无限递归)
- 性能开销明显更大,尤其对深层嵌套或大体积数据结构
- 例如:
a = [[1, 2], 3]; b = copy.deepcopy(a); b[0].append(4)→a保持不变
拷贝流程关键细节
拷贝行为取决于对象类型和是否可变。不可变对象(如int、str、tuple)在浅拷贝中无需新建,直接复用;而可变对象(如list、dict、set)才会触发实际复制逻辑。
立即学习“Python免费学习笔记(深入)”;
-
copy.copy()对不可变对象返回原引用,对可变对象新建顶层容器,但其内容仍为浅引用 -
copy.deepcopy()对所有可变对象递归调用自身,对不可变对象直接返回原引用(不复制) - 自定义类可通过实现
__copy__和__deepcopy__方法控制拷贝逻辑
什么时候该用哪个?
判断依据是是否需要隔离嵌套的可变状态。如果只操作顶层元素且内部不修改,浅拷贝足够;若需完全独立、防止副作用,必须用深拷贝。
- 函数传参时想避免修改原始数据 → 看数据结构深度,简单列表用
.copy(),含嵌套列表用deepcopy() - 配置对象多次初始化 → 深拷贝模板避免相互干扰
- 缓存中间结果并持续更新 → 浅拷贝节省内存和时间










