Python之深拷贝和浅拷贝

一、浅拷贝(Shallow Copy)

含义:

  • 创建一个新对象,但只复制最外层容器
  • 内部的元素(如子列表、字典等)仍然是引用原对象中的元素,并未真正复制。

实现方式:

  1. 切片操作(仅适用于 list、tuple 等序列)

    python 复制代码
    new_list = old_list[:]
  2. 使用 list()dict()set() 构造函数

    python 复制代码
    new_list = list(old_list)
    new_dict = dict(old_dict)
  3. 使用 copy 模块的 copy() 函数(通用)

    python 复制代码
    import copy
    new_obj = copy.copy(old_obj)

示例:

python 复制代码
import copy

original = [[1, 2], [3, 4]]
shallow = copy.copy(original)  # 或 original[:]

shallow[0][0] = 'X'

print(original)  # 输出: [['X', 2], [3, 4]] ← 被修改了!
print(shallow)   # 输出: [['X', 2], [3, 4]]

修改嵌套列表会影响原对象,因为内部列表是共享的。


二、深拷贝(Deep Copy)

含义:

  • 递归地复制对象及其所有嵌套的子对象。
  • 新对象与原对象完全独立,互不影响。

实现方式:

  • 必须使用 copy 模块的 deepcopy() 函数

    python 复制代码
    import copy
    new_obj = copy.deepcopy(old_obj)

示例:

python 复制代码
import copy

original = [[1, 2], [3, 4]]
deep = copy.deepcopy(original)

deep[0][0] = 'X'

print(original)  # 输出: [[1, 2], [3, 4]] ← 未被修改
print(deep)      # 输出: [['X', 2], [3, 4]]

修改深拷贝后的对象不会影响原始对象。


三、何时用浅拷贝 vs 深拷贝?

场景 推荐
对象是简单的一维列表/字典(不含嵌套可变对象) 浅拷贝足够,效率高
对象包含嵌套的可变对象(如列表中含字典)且需要完全隔离 必须用深拷贝
性能敏感且确定无嵌套引用 优先用浅拷贝或切片

四、注意事项

  • 不可变对象(如 int, str, tuple):即使浅拷贝,修改"内部"也不可能(因为不可变),所以通常无需深拷贝。
  • 循环引用deepcopy 能正确处理对象之间的循环引用,不会无限递归。
  • 性能deepcopycopy 慢很多,尤其对大型嵌套结构。

总结

方法 代码 是否复制嵌套对象 适用场景
浅拷贝 copy.copy(x)x[:] ❌ 否 简单结构、性能优先
深拷贝 copy.deepcopy(x) ✅ 是 嵌套结构、需完全独立

合理选择拷贝方式,既能避免意外副作用,又能保持程序效率。


自此,本文分享到此结束!!!

相关推荐
想会飞的蒲公英10 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
SeaTunnel11 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记11 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
CCPC不拿奖不改名11 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
Marst Code12 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
databook12 小时前
当散点图不够用时:用 t-SNE 可视化多维数据
python·数据分析·数据可视化
我的xiaodoujiao14 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
weixin_4080996715 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
去码头整点薯条ing15 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
赶紧写完去睡觉16 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda