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

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

相关推荐
360安全应急响应中心19 分钟前
Python代码保护之重置操作码映射的攻与防探究(一)
python·逆向
算家计算38 分钟前
一句话生成爆款视频!GPT-5赋能Agent,视频创作进入智能体时代
人工智能·aigc·agent
算家计算40 分钟前
使用指南 | Coze Studio 一站式AI智能体开发平台:低代码+多模型+RAG,快速打造你的专业级 AI Agent!
人工智能·agent·coze
码界奇点41 分钟前
Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
linux·服务器·python
uhakadotcom1 小时前
NPM与NPX的区别是什么?
前端·面试·github
dreams_dream1 小时前
django错误记录
后端·python·django
hixiong1231 小时前
C# 编写一个XmlToDota的转换工具
开发语言·人工智能·yolo·c#
MC皮蛋侠客1 小时前
使用Python实现DLT645-2007智能电表协议
python·网络协议·tcp/ip·能源
绝无仅有2 小时前
服务器Docker 安装和常用命令总结
后端·面试·github
中等生2 小时前
Python 的循环引入问题
python