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

 更新时间:2025年04月18日 09:51:47   作者:资源存储库  
这篇文章主要介绍了Python中deepcopy用法及注意事项的相关资料,deepcopy是Python中用于创建对象深拷贝的函数,与浅拷贝不同,它会递归地复制对象及其所有子对象,确保新对象是独立的副本,需要的朋友可以参考下

前言

deepcopy 是 Python 标准库中的 copy 模块提供的一个函数,它用于创建对象的深拷贝

深拷贝与浅拷贝的区别在于,深拷贝会递归地复制对象及其包含的所有对象,而浅拷贝仅复制对象本身,而不会递归地复制对象内部的子对象。

具体来说,deepcopy 会创建一个新的对象,并且确保新对象中的每个元素都是原对象中元素的独立副本深度复制整个对象结构

1. 浅拷贝与深拷贝的区别

  • 浅拷贝(shallow copy):复制对象本身,但是对于对象内的可变对象(如列表、字典等),它们仍然指向原对象中的相同位置。即拷贝的对象是原对象的"第一层"的副本,而对于嵌套的可变对象,浅拷贝只是引用它们

  • 深拷贝(deep copy):复制对象及其嵌套对象,确保所有的层次结构都是独立的。也就是说,深拷贝会递归地拷贝对象及其所有子对象。

2. deepcopy 的用法

import copy

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

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

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

print("Original:", original)
print("Deep Copied:", deep_copied)

输出:

Original: {'a': 1, 'b': [2, 3], 'c': {'d': 4}}
Deep Copied: {'a': 1, 'b': [100, 3], 'c': {'d': 200}}

解释:

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

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

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

import copy

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

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

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

print("Original:", original)
print("Shallow Copied:", shallow_copied)

输出:

Original: {'a': 1, 'b': [100, 3], 'c': {'d': 200}}
Shallow Copied: {'a': 1, 'b': [100, 3], 'c': {'d': 200}}

解释:

  • shallow_copied 是通过浅拷贝创建的,b 列表和 c 字典仍然指向 original 中的同一个对象,因此修改 shallow_copied 内部的 b 和 c 也会影响 original
  • 深拷贝不同,它会递归地复制所有的对象结构,避免了这种情况。

4. 为什么使用 deepcopy?

  • 避免意外修改原始对象:如果对象是嵌套的(比如包含列表、字典等可变类型),使用浅拷贝可能导致修改深层对象时,原始对象被意外修改。deepcopy 可以确保所有的层次结构都被独立复制,避免这种情况。

  • 独立的副本:有些场景下,你需要对一个对象进行修改,但是又希望保留原始对象不受影响。使用 deepcopy 可以确保创建一个完全独立的副本。

5. deepcopy 的工作原理

deepcopy 实际上会递归地遍历对象的所有层级,并对每个元素进行拷贝。对于内置类型(如列表、字典、集合等),它会根据对象的类型来决定如何拷贝。如果对象中含有自定义的类或对象,deepcopy 会根据类的 __deepcopy__ 方法来处理。

如果对象是不可变类型(如数字、字符串、元组等),deepcopy 会直接返回对象本身,因为它们本身就是不可变的。

6. __deepcopy__ 方法

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

import copy

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

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

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

# 对 MyClass 对象进行深拷贝
obj_copy = copy.deepcopy(obj)

输出:

Deep copying MyClass with value 42

解释:

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

7. 使用 deepcopy 时的注意事项

  • 性能开销deepcopy 会递归复制对象的所有层次,因此对于包含大量嵌套对象的复杂数据结构,使用 deepcopy 可能会带来较大的性能开销。在性能要求较高的场合,最好避免不必要的深拷贝。

  • 引用计数deepcopy 会创建所有嵌套对象的新副本,因此原始对象和拷贝对象之间没有任何共享部分。若有大量对象需要复制,可能会导致内存消耗较大。

  • 循环引用deepcopy 可以处理循环引用(即对象间相互引用),通过一个 memo 字典来确保每个对象只会被复制一次。

总结

deepcopy 是一种创建对象完全独立副本的工具,特别适用于需要复制复杂数据结构(如包含嵌套列表、字典等可变对象)的场景。

与浅拷贝不同,深拷贝会递归地复制对象及其所有嵌套元素,确保原始对象和副本之间没有任何共享部分。

在处理复杂对象或需要完全独立副本的场景中,deepcopy 是非常有用的工具。

到此这篇关于Python中deepcopy的用法及注意事项的文章就介绍到这了,更多相关Python deepcopy详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Tornado Application的实现

    Tornado Application的实现

    本文主要介绍了Tornado Application的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • python爬虫parsel-css选择器的具体用法

    python爬虫parsel-css选择器的具体用法

    本文主要介绍了python爬虫parsel-css选择器的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 关于Python中浮点数精度处理的技巧总结

    关于Python中浮点数精度处理的技巧总结

    双精度浮点数(double)是计算机使用的一种数据类型,使用 64 位(8字节) 来存储一个浮点数。下面这篇文章主要给大家总结介绍了关于Python中浮点数精度处理的技巧,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • 使用pycharm在本地开发并实时同步到服务器

    使用pycharm在本地开发并实时同步到服务器

    这篇文章主要介绍了使用pycharm在本地开发并实时同步到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Python整型运算之布尔型、标准整型、长整型操作示例

    Python整型运算之布尔型、标准整型、长整型操作示例

    这篇文章主要介绍了Python整型运算之布尔型、标准整型、长整型操作,结合具体实例形式分析了Python中布尔型、标准整型、长整型等相关运算技巧,代码备有详尽注释,需要的朋友可以参考下
    2017-07-07
  • Python操作列表常用方法实例小结【创建、遍历、统计、切片等】

    Python操作列表常用方法实例小结【创建、遍历、统计、切片等】

    这篇文章主要介绍了Python操作列表常用方法,结合实例形式总结分析了Python列表常见的创建、遍历、统计、切片等操作技巧与相关注意事项,需要的朋友可以参考下
    2019-10-10
  • Python在画图时使用特殊符号的方法总结

    Python在画图时使用特殊符号的方法总结

    在制作图表时,如果遇到需要利用特殊符号进行表示时该怎么办呢?不用慌,这篇文章为大家总结了python画图中使用各种特殊符号的方式,需要的可以参考一下
    2022-04-04
  • python中实现指定时间调用函数示例代码

    python中实现指定时间调用函数示例代码

    函数function是python编程核心内容之一,也是比较重要的一块。下面这篇文章主要给大家介绍了关于python中实现指定时间调用函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 利用jupyter网页版本进行python函数查询方式

    利用jupyter网页版本进行python函数查询方式

    这篇文章主要介绍了利用jupyter网页版本进行python函数查询方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python删除过期文件的方法

    python删除过期文件的方法

    这篇文章主要介绍了python删除过期文件的方法,涉及Python日期与文件的相关操作技巧,需要的朋友可以参考下
    2015-05-05

最新评论