• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Python中deepcopy的用法及注意事项详细解释

    发布者: 浪子 | 发布时间: 2025-6-17 08:16| 查看数: 92| 评论数: 0|帖子模式

    前言

    deepcopy 是 Python 标准库中的
    1. copy
    复制代码
    模块提供的一个函数,它用于创建对象的深拷贝
    1. 深拷贝与浅拷贝的区别在于,<strong>深拷贝</strong>会递归地复制对象及其包含的所有对象,而浅拷贝仅<strong>复制对象本身</strong>,而不会递归地复制对象内部的子对象。
    复制代码
    1. 具体来说,[code]deepcopy
    复制代码
    会创建一个新的对象,并且确保新对象中的每个元素都是原对象中元素的独立副本深度复制整个对象结构。[/code]
    1. 浅拷贝与深拷贝的区别


    • 浅拷贝(shallow copy):复制对象本身,但是对于对象内的可变对象(如列表、字典等),它们仍然指向原对象中的相同位置。即拷贝的对象是原对象的"第一层"的副本,而对于嵌套的可变对象,浅拷贝只是引用它们
    • 深拷贝(deep copy):复制对象及其嵌套对象,确保所有的层次结构都是独立的。也就是说,深拷贝会递归地拷贝对象及其所有子对象。

    2. deepcopy 的用法
    1. import copy

    2. # 示例:使用 deepcopy
    3. original = {'a': 1, 'b': [2, 3], 'c': {'d': 4}}

    4. # 创建原对象的深拷贝
    5. deep_copied = copy.deepcopy(original)

    6. # 修改深拷贝的内容,不影响原对象
    7. deep_copied['b'][0] = 100
    8. deep_copied['c']['d'] = 200

    9. print("Original:", original)
    10. print("Deep Copied:", deep_copied)
    复制代码
    输出:
    1. Original: {'a': 1, 'b': [2, 3], 'c': {'d': 4}}
    2. Deep Copied: {'a': 1, 'b': [100, 3], 'c': {'d': 200}}
    复制代码
    解释:

      1. original
      复制代码
      是一个包含嵌套字典和列表的字典。
      1. deepcopy
      复制代码
      创建了
      1. original
      复制代码
      对象的一个新副本,其中包括了
      1. original
      复制代码
      中所有嵌套结构(列表和字典)的独立副本。
    • 修改
      1. deep_copied
      复制代码
      中的
      1. b
      复制代码
      列表和
      1. c
      复制代码
      字典的值,不会影响到原始对象
      1. original
      复制代码
      ,因为它们已经是完全独立的对象。

    3. 浅拷贝与深拷贝的对比

    我们可以通过下面的例子进一步了解浅拷贝与深拷贝的区别:
    1. import copy

    2. # 示例对象:一个包含可变对象的字典
    3. original = {'a': 1, 'b': [2, 3], 'c': {'d': 4}}

    4. # 创建浅拷贝
    5. shallow_copied = copy.copy(original)

    6. # 修改浅拷贝的内部结构
    7. shallow_copied['b'][0] = 100
    8. shallow_copied['c']['d'] = 200

    9. print("Original:", original)
    10. print("Shallow Copied:", shallow_copied)
    复制代码
    输出:
    1. Original: {'a': 1, 'b': [100, 3], 'c': {'d': 200}}
    2. Shallow Copied: {'a': 1, 'b': [100, 3], 'c': {'d': 200}}
    复制代码
    解释:

      1. shallow_copied
      复制代码
      是通过浅拷贝创建的,
      1. b
      复制代码
      列表和
      1. c
      复制代码
      字典仍然指向
      1. original
      复制代码
      中的同一个对象,因此修改
      1. shallow_copied
      复制代码
      内部的
      1. b
      复制代码
      1. c
      复制代码
      也会影响
      1. original
      复制代码

    • 深拷贝不同,它会递归地复制所有的对象结构,避免了这种情况。

    4. 为什么使用 deepcopy?


    • 避免意外修改原始对象:如果对象是嵌套的(比如包含列表、字典等可变类型),使用浅拷贝可能导致修改深层对象时,原始对象被意外修改。
      1. deepcopy
      复制代码
      可以确保所有的层次结构都被独立复制,避免这种情况。
    • 独立的副本:有些场景下,你需要对一个对象进行修改,但是又希望保留原始对象不受影响。使用
      1. deepcopy
      复制代码
      可以确保创建一个完全独立的副本。

    5. deepcopy 的工作原理
    1. deepcopy
    复制代码
    实际上会递归地遍历对象的所有层级,并对每个元素进行拷贝。对于内置类型(如列表、字典、集合等),它会根据对象的类型来决定如何拷贝。如果对象中含有自定义的类或对象,
    1. deepcopy
    复制代码
    会根据类的
    1. __deepcopy__
    复制代码
    方法来处理。
    如果对象是不可变类型(如数字、字符串、元组等),
    1. deepcopy
    复制代码
    会直接返回对象本身,因为它们本身就是不可变的。

    6. __deepcopy__ 方法

    对于某些自定义对象,你可以通过实现
    1. __deepcopy__
    复制代码
    方法来定义对象的深拷贝行为。这个方法会在
    1. deepcopy
    复制代码
    时被自动调用。
    1. import copy

    2. class MyClass:
    3.     def __init__(self, value):
    4.         self.value = value

    5.     def __deepcopy__(self, memo):
    6.         # 自定义深拷贝逻辑
    7.         new_obj = MyClass(self.value)
    8.         print(f"Deep copying MyClass with value {self.value}")
    9.         return new_obj

    10. # 创建一个 MyClass 对象
    11. obj = MyClass(42)

    12. # 对 MyClass 对象进行深拷贝
    13. obj_copy = copy.deepcopy(obj)
    复制代码
    输出:
    1. Deep copying MyClass with value 42
    复制代码
    解释:

      1. __deepcopy__
      复制代码
      方法允许你自定义对象在深拷贝时的行为。在这个例子中,我们自定义了
      1. MyClass
      复制代码
      1. __deepcopy__
      复制代码
      方法来创建一个新的
      1. MyClass
      复制代码
      对象,并打印出深拷贝的相关信息。

    7. 使用 deepcopy 时的注意事项


      1. <strong>性能开销</strong>:[code]deepcopy
      复制代码
      会递归复制对象的所有层次,因此对于包含大量嵌套对象的复杂数据结构,使用
      1. deepcopy
      复制代码
      可能会带来较大的性能开销。在性能要求较高的场合,最好避免不必要的深拷贝。[/code]
      1. <strong>引用计数</strong>:[code]deepcopy
      复制代码
      会创建所有嵌套对象的新副本,因此原始对象和拷贝对象之间没有任何共享部分。若有大量对象需要复制,可能会导致内存消耗较大。[/code]
      1. <strong>循环引用</strong>:[code]deepcopy
      复制代码
      可以处理循环引用(即对象间相互引用),通过一个
      1. memo
      复制代码
      字典来确保每个对象只会被复制一次。[/code]

    总结
    1. [code]deepcopy
    复制代码
    是一种创建对象完全独立副本的工具,特别适用于需要复制复杂数据结构(如包含嵌套列表、字典等可变对象)的场景。[/code]
    1. 与浅拷贝不同,深拷贝会递归地复制对象及其所有嵌套元素,确保原始对象和副本之间没有任何共享部分。
    复制代码
    1. 在处理复杂对象或需要完全独立副本的场景中,[code]deepcopy
    复制代码
    是非常有用的工具。[/code]到此这篇关于Python中deepcopy的用法及注意事项的文章就介绍到这了,更多相关Python deepcopy详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/python/339867rag.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表