理解 Python 中的浅复制和深复制


理解 Python 中的浅复制和深复制

Python 提供了多种有效的方法来管理数据。在处理嵌套列表、字典或自定义对象等数据结构时,理解浅复制和深复制的概念是至关重要的。

在 Python 中,浅拷贝和深拷贝是两种不同的拷贝方式。浅拷贝只复制引用,不复制内部对象,而深拷贝则完全复制整个对象,包括其内部的子对象。尤其是在算法中,可能需要用到拷贝的概念来解决问题,如列表、字符串等数据结构(初学者包括我会犯的错, a=[1,2,3,4] ,然后又使用 b=a ,然后在 b 上修改列表,导致 a 也发生变化)

浅拷贝在 Python 中可以通过几种方式实现,如使用 copy 模块的 copy () 函数,切片操作 [:],以及字典和集合的拷贝方法.copy ()。深拷贝则可以通过 copy 模块的 deepcopy () 函数来实现。在选择拷贝方式时,重要的是理解对象的结构和需求,以确保拷贝行为符合预期。

使用浅复制
浅复制通过创建原始对象的顶层结构的副本来工作。这意味着如果原始对象包含嵌套对象,复制将引用与原始对象相同的嵌套对象。换句话说,对对象进行浅复制会复制其最外层结构,而不会复制它可能包含的任何嵌套对象。

要在 Python 中执行浅复制,您可以使用 copy 模块的 copy () 函数或对象上的 .copy () 方法。
要在 Python 中创建深度复制,可以使用 copy 模块的 deepcopy () 函数。

考虑一个在 Python 中使用列表或字典的示例。

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)
shallow_copy2 = copy.deepcopy(main_list)
# 修改嵌套列表
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")
print(f"The shallow copy list2: {shallow_copy2}")

上面的代码中,main_list 变量包含一个包含整数和包含字母的内部列表(嵌套对象)。copy 函数创建了 main_list 的副本,代码将其存储在另一个变量 shallow_copy 中。

与此同时,对 shallow_copy 或 main_list 中的外部项(整数)所做的任何更改仅会影响该实例。这些外部项本质上是独立的值,而不仅仅是引用。

当您修改 deep_copy 中的嵌套列表或外部项时,您的更改不会影响原始列表,反之亦然。这表明嵌套列表或外部元素不在两个副本之间共享。

在处理字典时,相同的理念也适用。

#### 使用浅复制和深复制的用途

  • 如果您想要复制一个复杂对象而不生成其嵌套对象的新实例,则使用浅复制。这种方法比深复制更节省内存并且更快,因为它不会复制嵌套对象。
  • 如果您想要创建对象状态的快照,同时仍然在原始对象和复制对象之间共享一些基础数据,则使用浅复制。
  • 如果您想要修改对象的副本而不影响原始对象,则使用深复制。这会生成独立的嵌套对象的副本,确保对副本的任何更改不会应用于原始对象。
  • 当您需要独立副本的嵌套数据结构时,特别是在处理递归或复杂的对象层次结构时,深复制非常重要。

文章作者: liuli
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuli !
评论
评论
  目录