苦练Python第30天:浅拷贝 VS 深拷贝

前言

大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!

欢迎来到 Python百日计划第30天

恭喜你已达成 三分之一 里程碑!🎉

今天我们要攻克一个让许多 Python 学习者抓耳挠腮的核心概念:
列表的复制与克隆 ------ 浅拷贝 vs 深拷贝

掌握它们,你就不会在复杂数据结构中踩坑。


🎯 今日收获预览

  • 赋值、浅拷贝、深拷贝的本质区别
  • 列表在内存中的真实复制过程
  • 实战代码与常见陷阱
  • 何时用浅拷贝、何时用深拷贝的决策指南

📦 赋值 ≠ 复制

先认清一个残酷事实:

python 复制代码
a = [1, 2, 3]
b = a

你以为 b 是新列表?错!它只是 同一对象的新引用

python 复制代码
b.append(4)
print(a)  # [1, 2, 3, 4]

因为 ab 指向 同一片内存


✂️ 真正复制列表的 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] 指向 同一个内部列表


🧬 深拷贝:连内脏都克隆

使用标准库 copydeepcopy 可彻底斩断引用链。

✅ 深拷贝示例

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]]

此时 ab 完全独立,任意层级改动互不干扰。


🔍 何时用什么?快速决策表

场景 推荐做法
仅含数字/字符串的扁平列表 浅拷贝 a[:] 足够
含嵌套列表或自定义对象 深拷贝 copy.deepcopy(a)
只想共享数据、不复制 直接赋值 b = a

🧪 现实类比:钥匙、房间与家具

  • 赋值 (=):把自家钥匙给别人,房子还是同一套。
  • 浅拷贝:把房间复制一份,但家具仍共用。
  • 深拷贝:连房子带家具全部重建一套新的。

💡 常见坑位提醒

  1. 误以为 .copy() 会递归克隆 ------ 不会!
  2. 改了嵌套列表,原列表同步变 ------ 99% 是浅拷贝惹祸。
  3. 无脑 deepcopy ------ 大对象会拖慢程序,按需使用。

🧭 今日小结

  • 赋值只是引用,不会复制数据
  • 浅拷贝复制外层,内层共享
  • 深拷贝递归复制,彻底隔离
  • copy.deepcopy() 解决嵌套引用问题

最后感谢阅读!欢迎关注我,微信公众号倔强青铜三。欢迎点赞收藏关注,一键三连!!!

相关推荐
鹿角片ljp2 分钟前
Redis 深度复习:从入门到面试通关
数据库·redis·面试
小玮看世界8 分钟前
[Python]自动驾驶感知与决策练习题 (1-10)
开发语言·python·自动驾驶
Highcharts.js8 分钟前
五大痛点拖慢数据分析平台决策效率:Highchart可视化与AI分析解决方案解析
人工智能·信息可视化·数据分析·数据可视化·highcharts·ai可视化分析
义嘉泰15 分钟前
手腕上的小手电:智能手表怎么把“绿光”变成心率
人工智能·智能手表
Ming_studying16 分钟前
Python + SQLite FTS5 构建本地文档全文搜索器:增量索引、中文检索与高亮
jvm·数据库·python·sqlite
Canace23 分钟前
AI 生成到 90% 突然断了:你的解决方案是?
前端·人工智能
湘美书院--湘美谈教育23 分钟前
AI时代的奥德赛:算法星空,寻找精神归航
大数据·人工智能·深度学习·机器学习·生活
玉鸯29 分钟前
让 Agent 面向用户:AG-UI 协议构建 Agent 前端
前端·python·agent
瓦学妹39 分钟前
2026亚马逊本土店怎么注册?入驻流程、资料准备与常见问题
大数据·运维·人工智能
小白学大数据42 分钟前
把 Modbus 轮询塞进 Trio 的异步循环:内存映射与定时采集实战
网络·python·搜索引擎