因为浅拷贝只复制顶层对象,嵌套的列表、字典等仍共享内存地址,修改嵌套内容会同步影响原对象;deepcopy虽能递归隔离多数嵌套引用,但对循环引用、不可序列化对象及自定义类状态异常等情况不适用。

为什么修改副本会影响原对象?
这是因为你用的是浅拷贝,或者根本没拷贝——比如直接赋值 a = b。Python 中的变量名只是对象的引用,copy.copy() 只复制顶层对象,嵌套里的列表、字典、自定义类实例等仍共享内存地址。一旦修改嵌套内容(比如 obj[0].append(99)),原对象同步变化。
deepcopy 真的能解决所有嵌套引用吗?
绝大多数情况可以,但要注意三个边界:
-
deepcopy无法处理循环引用:如果对象 A 持有 B,B 又持有 A,deepcopy会递归下去直到栈溢出或抛出RecursionError - 含有不可序列化对象(如文件句柄
open('x.txt')、线程锁threading.Lock())时,deepcopy会失败并抛出TypeError - 自定义类若重写了
__reduce__或__getstate__,且逻辑有误,可能导致深拷贝后状态异常
什么时候不该用 deepcopy?
性能敏感场景下,deepcopy 是全量递归遍历,开销大。比如处理上万条嵌套字典的 JSON 数据时,比 json.loads(json.dumps(obj)) 慢 3–5 倍。更糟的是,它会拷贝所有属性,包括你不关心的私有字段或缓存属性(如 _cache)。实操建议:
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 确认是否真需要“完全隔离”——有时用
copy.copy()+ 手动重建关键嵌套层更轻量 - 对纯数据结构(
dict/list/tuple),优先考虑json.loads(json.dumps(obj))(注意:仅限 JSON 兼容类型,不支持datetime、set等) - 对 pandas DataFrame 或 numpy array,别用
deepcopy,直接调用.copy(deep=True)或.copy(),它们内部做了优化
如何验证 deep copy 是否生效?
别只看顶层 id() 不同,要检查嵌套对象的地址:
立即学习“Python免费学习笔记(深入)”;
import copy
a = [[1, 2], {'x': 3}]
b = copy.deepcopy(a)
print(id(a), id(b)) # 地址不同 ✅
print(id(a[0]), id(b[0])) # 地址也不同 ✅
print(id(a[1]), id(b[1])) # 地址也不同 ✅
a[0].append(99)
print(b[0]) # 输出 [1, 2],未变 ✅
漏掉第二层 id() 检查,就容易误判——这是最常被跳过的验证步骤。

















