copy.deepcopy()是唯一能真正深拷贝嵌套列表的函数,它递归复制每一层对象;而list.copy()和copy.copy()仅为浅拷贝,修改副本内层会影响原对象。

copy.deepcopy() 是唯一能真正深拷贝嵌套列表的函数
Python 的 list.copy() 和 copy.copy() 都只做浅拷贝,遇到嵌套结构(比如列表里还有列表)时,内层对象仍是引用。只有 copy.deepcopy() 会递归复制每一层对象,确保修改副本不影响原数组。
常见错误现象:arr = [[1, 2], [3]]; b = arr.copy(); b[0].append(99); print(arr) → 输出 [[1, 2, 99], [3]],说明原数组被意外改了。
- 使用场景:处理含字典、列表、自定义类实例的嵌套数据结构时必须用
copy.deepcopy() - 性能影响:深拷贝比浅拷贝慢得多,尤其对大嵌套结构;如果只是单层数字列表,
arr[:]或list(arr)更快且安全 - 兼容性注意:某些不可序列化的对象(如文件句柄、线程锁)无法被
deepcopy处理,会抛出TypeError: unshallowable object
numpy.array 要用 .copy() 方法,不是 copy.deepcopy()
NumPy 数组是连续内存块,copy.deepcopy() 不仅慢,还可能破坏数组元信息(如 dtype、strides),甚至在某些版本中引发 RecursionError。
正确做法是直接调用数组自身的 .copy() 方法——它专为 NumPy 设计,返回一个内存独立、属性完整的新数组。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
import numpy as np; a = np.array([[1,2],[3,4]]); b = a.copy()→ 安全、高效、保留 dtype 和 shape - 误用
copy.deepcopy(a)可能导致AttributeError: 'numpy.ndarray' object has no attribute '__dict__'(旧版 NumPy)或静默降级为浅拷贝 - 切片如
a[:]或a.copy(order='C')在特定内存布局下行为不同,普通深拷需求直接用.copy()最稳妥
自定义类里要小心 __dict__ 和不可变字段
如果类实例包含嵌套可变对象(如列表、字典),copy.deepcopy() 默认会递归处理 __dict__,但遇到有 __slots__、描述符或 C 扩展属性时可能漏拷贝。
常见错误现象:深拷贝后修改副本的某个字段,原对象对应字段也变了,或者抛出 AttributeError。
- 检查类是否定义了
__getstate__和__setstate__;没有的话,deepcopy依赖__dict__,而__slots__类默认没有__dict__ - 不可变字段(如
namedtuple实例)会被共享引用,无需深拷;但若它内部又含可变对象(如namedtuple(a=[1,2])),仍需深拷 - 简单对策:在类中显式实现
__deepcopy__(self, memo),控制哪些字段复制、哪些复用
字符串和数字不用深拷贝,但要注意“伪可变”陷阱
Python 中 str、int、float、tuple(不含可变项)是不可变对象,无论浅拷还是深拷,都只是复制引用,行为一致。但别因此放松警惕——它们常藏在可变容器里。
典型坑:d = {'x': 'hello'}; d2 = copy.deepcopy(d); d2['x'] += ' world' 看似改了副本,其实 += 创建了新字符串,原 d['x'] 不变;但如果 d = {'x': ['a']},d2['x'].append('b') 就真会影响原字典。
- 判断依据不是类型名,而是对象是否支持原地修改(即有没有
__setitem__、append这类方法) - 用
id(obj)对比原对象和副本中对应元素的地址,能快速验证是否真的隔离 - 对纯数据结构(如 JSON-like 字典+列表+基本类型),
json.loads(json.dumps(obj))是一种替代深拷方式,但会丢精度(如int变float、丢失元数据)
深拷贝不是银弹,关键是搞清数据结构里哪一层可变、哪一层只是“看起来像容器”。多一层 isinstance(x, (list, dict, set)) 判断,有时比无脑 deepcopy 更可靠。

















