浅复制与深复制:先画清楚对象之间的箭头
复制二维列表后修改内部行,原数据也变了。问题不是 copy 失效,而是外层容器复制完成后,内部对象仍被两个容器共同引用。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Python Tutorial for Beginners
Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
复制二维列表后修改内部行,原数据也变了。问题不是 copy 失效,而是外层容器复制完成后,内部对象仍被两个容器共同引用。
理解核心机制
list.copy 只复制外层引用;deepcopy 会递归复制并维护已复制对象的映射,从而处理环及共享关系。理解复制结果时,应把变量、容器和内部元素分别画出来。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
from copy import deepcopy
original = [[1], [2]]
shallow = original.copy()
deep = deepcopy(original)
shallow[0].append(3)
assert original[0] == [1, 3]
assert deep[0] == [1]
print(original, deep)适用边界与常见误区
深复制不适合任意资源对象,例如连接、锁和文件句柄。对于业务数据,显式重建需要的字段往往更能表达复制范围,也更容易控制成本。
继续练习
让两行指向同一个列表,检查 deepcopy 后它们是否仍共享同一个新对象,再比较通过列表推导逐行复制的结果。