苦练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() 解决嵌套引用问题

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

相关推荐
DO_Community3 小时前
普通服务器都能跑:深入了解 Qwen3-Next-80B-A3B-Instruct
人工智能·开源·llm·大语言模型·qwen
WWZZ20253 小时前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
deephub3 小时前
深入BERT内核:用数学解密掩码语言模型的工作原理
人工智能·深度学习·语言模型·bert·transformer
PKNLP3 小时前
BERT系列模型
人工智能·深度学习·bert
应用市场4 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
兰亭妙微4 小时前
ui设计公司审美积累 | 金融人工智能与用户体验 用户界面仪表盘设计
人工智能·金融·ux
东方佑4 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
AKAMAI4 小时前
安全风暴的绝地反击 :从告警地狱到智能防护
运维·人工智能·云计算
岁月宁静4 小时前
深度定制:在 Vue 3.5 应用中集成流式 AI 写作助手的实践
前端·vue.js·人工智能
Dfreedom.4 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型