浅拷贝只复制第一层,嵌套对象仍共享引用;深拷贝递归复制所有层级,彻底隔离嵌套结构;eval(repr(x))模拟深拷贝危险且低效,应优先使用copy.deepcopy()并确认必要性。
当你用 copy.copy() 或切片 list[:]、list.copy() 复制一个含嵌套列表的 Python 列表时,外层数组是新的,但内部子列表仍是原对象的引用。修改子列表会同步影响原列表。
int、str、tuple),或你明确希望子对象共享original = [[1, 2], 3] shallow = original.copy() shallow[0].append(3) print(original) # 输出 [[1, 2, 3], 3] —— 原列表被意外改了
copy.copy() 和 list.copy() 行为一致,但后者仅限 list 类型copy.deepcopy() 会逐层遍历并新建所有可变对象(包括嵌套的 list、dict、set 等),确保新旧对象完全独立。
RecursionError)deepcopy 对自定义类需实现 __reduce__ 或 __getstate__ 才能正确还原状态eval(repr(x)) 模拟深拷贝有人用 eval(repr(x)) 尝试“序列化再重建”,这非常危险:
repr() 不返回可执行字符串,eval 直接报错x 来自不可信输入)deepcopy,且类型可能丢失(如 numpy.ndarray 变成普通 list)copy.deepcopy(),但先确认是否真有必要很多场景其实只需浅拷贝——比如临时修改参数、构造中间结果。盲目用 deepcopy 容易掩盖设计问题,还拖慢性能。
new[0] = [4,5]),浅拷贝已足够deep_copy = [sublist[:] for sublist in original]
深拷贝大对象,考虑用不可变数据结构(如 tuple 嵌套)或改用 dataclasses.replace() + 冻结实例嵌套可变对象的生命周期和所有权容易被忽略,这是深浅拷贝问题最常出错的地方。