掘金 人工智能 07月26日 10:15
苦练Python第30天:浅拷贝 VS 深拷贝
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入浅出地讲解了Python中列表的赋值、浅拷贝和深拷贝这三种操作的本质区别。文章通过生动的代码示例和内存机制的解释,揭示了赋值只是引用,而浅拷贝只复制列表外层,嵌套对象仍共享引用。深拷贝则能彻底克隆所有嵌套对象,实现完全独立。文末提供了根据场景选择复制方式的决策指南,并提醒了常见的易错点,帮助读者避免在处理复杂数据结构时踩坑,高效编写Python代码。

🔹 赋值操作并非复制:Python中的赋值操作(如 `b = a`)只是创建了一个指向同一内存地址的新引用,修改其中一个列表会影响另一个,因为它们指向的是同一个对象。

🔸 浅拷贝只复制外层列表:使用 `list()`, 切片 `[:]` 或 `.copy()` 方法进行的浅拷贝,会创建一个新的外层列表,但列表内的嵌套对象(如嵌套列表或自定义对象)仍然与原列表共享引用,修改嵌套对象会影响原列表。

🔹 深拷贝实现完全独立:通过 `copy.deepcopy()` 可以递归地复制列表及其所有嵌套对象,生成一个全新的、完全独立的副本。修改深拷贝的任何部分都不会影响原列表。

🔸 按需选择复制方式:对于仅包含数字或字符串等不可变元素的扁平列表,浅拷贝(如 `a[:]`)足够高效;对于包含嵌套列表或自定义对象的复杂列表,应使用深拷贝 (`copy.deepcopy()`) 以避免意外修改。

前言

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

欢迎来到 Python百日计划第30天
恭喜你已达成 三分之一 里程碑!🎉

今天我们要攻克一个让许多 Python 学习者抓耳挠腮的核心概念:
列表的复制与克隆 —— 浅拷贝 vs 深拷贝
掌握它们,你就不会在复杂数据结构中踩坑。


🎯 今日收获预览


📦 赋值 ≠ 复制

先认清一个残酷事实:

a = [1, 2, 3]b = a

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

b.append(4)print(a)  # [1, 2, 3, 4]

因为 ab 指向 同一片内存


✂️ 真正复制列表的 3 种姿势

方法语法示例
list() 构造b = list(a)
切片b = a[:]
.copy() 方法b = a.copy()

以上三种都只能得到 浅拷贝


🌊 浅拷贝:只复制外壳,不复制内脏

浅拷贝会新建一个外层列表,但 内嵌对象仍共享引用

🔁 示例:修改嵌套列表

a = [[1, 2], [3, 4]]b = a.copy()b[0][0] = 999print(a)   # [[999, 2], [3, 4]]

为什么 a 也被改了?
因为 a[0]b[0] 指向 同一个内部列表


🧬 深拷贝:连内脏都克隆

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

✅ 深拷贝示例

import copya = [[1, 2], [3, 4]]b = copy.deepcopy(a)b[0][0] = 999print(a)  # [[1, 2], [3, 4]]print(b)  # [[999, 2], [3, 4]]

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


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

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

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


💡 常见坑位提醒

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

🧭 今日小结

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

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python 列表复制 浅拷贝 深拷贝 数据结构
相关文章