WMX · 随记
·Python· 3 分钟阅读

浅复制与深复制:先画清楚对象之间的箭头

复制二维列表后修改内部行,原数据也变了。问题不是 copy 失效,而是外层容器复制完成后,内部对象仍被两个容器共同引用。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Python Tutorial for Beginners

Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

复制二维列表后修改内部行,原数据也变了。问题不是 copy 失效,而是外层容器复制完成后,内部对象仍被两个容器共同引用。

理解核心机制

list.copy 只复制外层引用;deepcopy 会递归复制并维护已复制对象的映射,从而处理环及共享关系。理解复制结果时,应把变量、容器和内部元素分别画出来。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python8 行 · 可横向滚动
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 后它们是否仍共享同一个新对象,再比较通过列表推导逐行复制的结果。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档