前言
大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
欢迎来到 Python百日计划第30天!
恭喜你已达成 三分之一 里程碑!🎉
今天我们要攻克一个让许多 Python 学习者抓耳挠腮的核心概念:
列表的复制与克隆 —— 浅拷贝 vs 深拷贝。
掌握它们,你就不会在复杂数据结构中踩坑。
🎯 今日收获预览
- 赋值、浅拷贝、深拷贝的本质区别列表在内存中的真实复制过程实战代码与常见陷阱何时用浅拷贝、何时用深拷贝的决策指南
📦 赋值 ≠ 复制
先认清一个残酷事实:
a = [1, 2, 3]b = a
你以为 b
是新列表?错!它只是 同一对象的新引用。
b.append(4)print(a) # [1, 2, 3, 4]
因为 a
与 b
指向 同一片内存。
✂️ 真正复制列表的 3 种姿势
方法 | 语法示例 |
---|---|
list() 构造 | b = list(a) |
切片 | b = a[:] |
.copy() 方法 | b = a.copy() |
以上三种都只能得到 浅拷贝。
🌊 浅拷贝:只复制外壳,不复制内脏
浅拷贝会新建一个外层列表,但 内嵌对象仍共享引用。
🔁 示例:修改嵌套列表
a = [[1, 2], [3, 4]]b = a.copy()b[0][0] = 999print(a) # [[999, 2], [3, 4]]
为什么 a
也被改了?
因为 a[0]
与 b[0]
指向 同一个内部列表。
🧬 深拷贝:连内脏都克隆
使用标准库 copy
的 deepcopy
可彻底斩断引用链。
✅ 深拷贝示例
import copya = [[1, 2], [3, 4]]b = copy.deepcopy(a)b[0][0] = 999print(a) # [[1, 2], [3, 4]]print(b) # [[999, 2], [3, 4]]
此时 a
与 b
完全独立,任意层级改动互不干扰。
🔍 何时用什么?快速决策表
场景 | 推荐做法 |
---|---|
仅含数字/字符串的扁平列表 | 浅拷贝 a[:] 足够 |
含嵌套列表或自定义对象 | 深拷贝 copy.deepcopy(a) |
只想共享数据、不复制 | 直接赋值 b = a |
🧪 现实类比:钥匙、房间与家具
- 赋值 (
=
):把自家钥匙给别人,房子还是同一套。浅拷贝:把房间复制一份,但家具仍共用。深拷贝:连房子带家具全部重建一套新的。💡 常见坑位提醒
- 误以为
.copy()
会递归克隆 —— 不会!改了嵌套列表,原列表同步变 —— 99% 是浅拷贝惹祸。无脑 deepcopy
—— 大对象会拖慢程序,按需使用。🧭 今日小结
- 赋值只是引用,不会复制数据浅拷贝复制外层,内层共享深拷贝递归复制,彻底隔离用
copy.deepcopy()
解决嵌套引用问题最后感谢阅读!欢迎关注我,微信公众号:
倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!