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