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

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

相关推荐
浪浪山_大橙子几秒前
OpenClaw 十分钟快速,安装与接入完全指南 - 推荐使用trae 官方 skills 安装
前端·人工智能
databook3 分钟前
探索视觉的边界:用 Manim 重现有趣的知觉错觉
python·动效
离开地球表面_995 分钟前
金三银四程序员跳槽指南:从简历到面试再到 Offer 的全流程准备
前端·后端·面试
UrbanJazzerati5 分钟前
Scrapling入门指南:零基础也能学会的网页抓取神器
后端·面试
比尔盖茨的大脑7 分钟前
事件循环底层原理:从 V8 引擎到浏览器实现
前端·javascript·面试
火山引擎开发者社区13 分钟前
OpenClaw 快速上手:把云手机变成你的 7×24 小时 AI 手机助手
人工智能
Qlly14 分钟前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
Lee川20 分钟前
从零构建智能对话系统:AI Agent 实战指南
人工智能
Qinana26 分钟前
从 URL 输入到页面展示:一场跨越进程与协议的“装修”大戏
前端·面试·程序员
我叫黑大帅43 分钟前
Go中的interface的两大用法
后端·面试·go