您的位置 首页 知识

python3 deepcopy Python中deepcopy的用法及注意事项

python3 deepcopy Python中deepcopy的用法及注意事项

目录
  • 前言
  • 1.浅拷贝与深拷贝的区别
  • 2.deepcopy的用法
  • 3.浅拷贝与深拷贝的对比
  • 4.为什么使用deepcopy?
  • 5.deepcopy的职业原理
  • 6.__deepcopy__技巧
  • 7.使用deepcopy时的注意事项
  • 拓展资料

前言

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

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

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

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

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

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

2.deepcopy的用法

import copy 示例:使用 deepcopyoriginal = ‘a’: 1, ‘b’: [2, 3], ‘c’: ‘d’: 4}} 创建原对象的深拷贝deep_copied = copy.deepcopy(original) 修改深拷贝的内容,不影响原对象deep_copied[‘b’][0] = 100deep_copied[‘c’][‘d’] = 200print(“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] = 100shallow_copied[‘c’][‘d’] = 200print(“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内部的bc也会影响original
  • 深拷贝不同,它会递归地复制所有的对象结构,避免了这种情况。

4.为什么使用deepcopy?

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

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

5.deepcopy的职业原理

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

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

6.__deepcopy__技巧

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

import copyclass 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的用法及注意事项的文章就介绍到这了,更多相关Pythondeepcopy详解内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

无论兄弟们可能感兴趣的文章:

  • Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
  • python中copy()与deepcopy()的区别
  • 浅谈python中copy和deepcopy中的区别
  • Python 中的 copy()和deepcopy()
  • Python-copy()与deepcopy()区别详解
  • 图解Python中浅拷贝copy()和深拷贝deepcopy()的区别
  • python中copy和deepcopy的使用区别