当前位置: 首页 > news >正文

python中的深拷贝与浅拷贝详细介绍

在 Python 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们在复制对象时的行为和结果有所不同。以下是详细介绍、使用场景及代码示例。

浅拷贝(Shallow Copy)

定义

浅拷贝创建一个新对象,但只复制原始对象的引用,而不是实际的对象内容。如果原始对象包含可变对象(如列表、字典等),浅拷贝会包含对这些可变对象的引用,而不是它们的副本。

使用场景
  1. 简单数据结构:当对象只包含不可变类型(如整数、字符串、元组等)时,浅拷贝可以快速复制对象。
  2. 性能优化:浅拷贝比深拷贝更快,因为它只复制引用,不复制实际对象内容。
代码示例
import copy# 创建一个包含可变对象和不可变对象的列表
original_list = [1, 2, [3, 4], 5]# 浅拷贝
shallow_copied_list = copy.copy(original_list)# 修改原始列表中的可变对象
original_list[2][0] = 'X'print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

输出结果:

Original List: [1, 2, ['X', 4], 5]
Shallow Copied List: [1, 2, ['X', 4], 5]

解释:

  • original_listshallow_copied_list 都包含对同一个嵌套列表 [3, 4] 的引用。
  • 修改 original_list 中的嵌套列表时,shallow_copied_list 也受到影响,因为它们共享同一个嵌套列表。

深拷贝(Deep Copy)

定义

深拷贝创建一个新对象,并递归地复制原始对象中的所有内容。如果原始对象包含可变对象,深拷贝会创建这些可变对象的副本,而不是引用。

使用场景
  1. 复杂数据结构:当对象包含嵌套的可变对象时,深拷贝可以确保完全独立的副本。
  2. 避免副作用:当需要修改副本而不影响原始对象时,深拷贝是必要的。
代码示例
import copy# 创建一个包含可变对象和不可变对象的列表
original_list = [1, 2, [3, 4], 5]# 深拷贝
deep_copied_list = copy.deepcopy(original_list)# 修改原始列表中的可变对象
original_list[2][0] = 'X'print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)

输出结果:

Original List: [1, 2, ['X', 4], 5]
Deep Copied List: [1, 2, [3, 4], 5]

解释:

  • original_listdeep_copied_list 是完全独立的副本。
  • 修改 original_list 中的嵌套列表时,deep_copied_list 不受影响,因为它们是独立的副本。

使用场景及注意事项

浅拷贝
  1. 简单数据结构

    • 当对象只包含不可变类型时,浅拷贝可以快速复制对象。
    • 示例:
      original_tuple = (1, 2, 3)
      shallow_copied_tuple = copy.copy(original_tuple)
      print(shallow_copied_tuple)  # 输出 (1, 2, 3)
      
  2. 性能优化

    • 浅拷贝比深拷贝更快,因为它只复制引用,不复制实际对象内容。
    • 示例:
      original_list = [1, 2, 3]
      shallow_copied_list = copy.copy(original_list)
      print(shallow_copied_list)  # 输出 [1, 2, 3]
      
深拷贝
  1. 复杂数据结构

    • 当对象包含嵌套的可变对象时,深拷贝可以确保完全独立的副本。
    • 示例:
      original_dict = {'a': 1, 'b': [2, 3]}
      deep_copied_dict = copy.deepcopy(original_dict)
      original_dict['b'][0] = 'X'
      print("Original Dict:", original_dict)  # 输出 {'a': 1, 'b': ['X', 3]}
      print("Deep Copied Dict:", deep_copied_dict)  # 输出 {'a': 1, 'b': [2, 3]}
      
  2. 避免副作用

    • 当需要修改副本而不影响原始对象时,深拷贝是必要的。
    • 示例:
      original_list = [[1, 2], [3, 4]]
      deep_copied_list = copy.deepcopy(original_list)
      original_list[0][0] = 'X'
      print("Original List:", original_list)  # 输出 [['X', 2], [3, 4]]
      print("Deep Copied List:", deep_copied_list)  # 输出 [[1, 2], [3, 4]]
      

注意事项

  1. 性能问题

    • 深拷贝比浅拷贝更耗时,因为它需要递归复制所有内容。在处理大型数据结构时,要注意性能问题。
  2. 循环引用

    • 如果对象中存在循环引用,深拷贝可能会导致无限递归。copy.deepcopy 会处理循环引用,但需要确保对象的结构不会导致无限递归。
  3. 自定义对象

    • 如果需要对自定义对象进行深拷贝或浅拷贝,可以实现 __copy____deepcopy__ 方法来自定义拷贝行为。

总结

  • 浅拷贝:适用于简单数据结构或性能优化场景,只复制引用,不复制实际对象内容。
  • 深拷贝:适用于复杂数据结构或需要避免副作用的场景,递归复制所有内容,确保完全独立的副本。

根据具体需求选择合适的拷贝方式,可以提高代码的效率和可维护性。


文章转载自:

http://QtfNcNDr.qbmpb.cn
http://PC9XatjX.qbmpb.cn
http://U1RhZ1pv.qbmpb.cn
http://4b3Lpd5h.qbmpb.cn
http://WRSWkW7X.qbmpb.cn
http://ppzUsZw0.qbmpb.cn
http://0qZrrvNi.qbmpb.cn
http://tl9Edmn6.qbmpb.cn
http://Mvx9Xql3.qbmpb.cn
http://49hVA6pO.qbmpb.cn
http://FcOxe0AC.qbmpb.cn
http://Kw59HEVQ.qbmpb.cn
http://sAHIGeJE.qbmpb.cn
http://HDFicjqA.qbmpb.cn
http://hhevTNDp.qbmpb.cn
http://HSxaP9mJ.qbmpb.cn
http://6qXx8qT3.qbmpb.cn
http://CBxlSHZh.qbmpb.cn
http://rIqCDIpb.qbmpb.cn
http://zVFwbiky.qbmpb.cn
http://ii3ZXOn3.qbmpb.cn
http://tLX0yF5J.qbmpb.cn
http://LUSeHL2k.qbmpb.cn
http://WA4Dt1Qc.qbmpb.cn
http://IvNWR9ui.qbmpb.cn
http://uD0PHJIU.qbmpb.cn
http://iG7J8uaW.qbmpb.cn
http://gfvZjYL9.qbmpb.cn
http://pzDi2EYA.qbmpb.cn
http://BD0ylrtK.qbmpb.cn
http://www.dtcms.com/a/374915.html

相关文章:

  • 【Java】Hibernate二级缓存下
  • R 包的管理涉及两个概念:二进制包的下载缓存位置和包的最终安装位置。你看到的临时路径只是包的下载缓存,它并不会长期占用C盘空间
  • Android 项目:画图白板APP开发(四)——笔锋(单 Path)
  • Nginx反向代理与负载均衡部署
  • 微算法科技(NASDAQ: MLGO)采用量子相位估计(QPE)方法,增强量子神经网络训练
  • Vue: Class 与 Style 绑定
  • 在 Cursor IDE 中配置 SQLTools 连接 MySQL 数据库指南(Windows 11)
  • SKYTRAC-无人机、无人机系统和城市空中交通卫星通信 – BVLOS 和 C2 卫星通信终端和任务服务器
  • 如何将 iPhone 备份到电脑/PC 的前 5 种方法
  • AdsPower RPA 从excel中依次读取多个TikTok账号对多个TikTok账号目标发送信息
  • 大规模系统中的分库分表原理深度解析与性能优化实践指南
  • mac M1上安装windows虚拟机报错
  • Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系
  • 合理安排时间节点,避免影响正常生产——制造企业软件系统上线的关键考量
  • OBS直播教程:点歌直播间怎么弄?直播点歌用什么软件?
  • Apache Cloudberry 2.0.0 发布:1981 项变更提交,续写 Greenplum 未竟之路
  • Java全栈工程师的面试实战:从基础到微服务
  • [网络入侵AI检测] 循环神经网络(RNN)模型(LSTM/GRU/SimpleRNN)
  • CS336——1. Overview
  • 封装日期选择器组件,带有上周,下周按钮
  • PyTorch图像预处理:ToTensor()与Normalize()的本质区别
  • openssl简介
  • 八、Win/Linux/macOS全平台彻底卸载Docker的操作指南
  • 基于野火F407开发板实现电源管理-停止模式
  • Linux中 Swap 有哪些作用
  • Transformer架构:深度学习中的革命性模型
  • 解决window下共享资源报“不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接“问题
  • 自然语言处理 (NLP) 基础:词向量、模型与应用
  • C++设计模式之单例模式
  • C# ---ToLookUp