[Python] 深复制与浅复制:理解列表、字典等

Python提供了两种复制对象的方式:深拷贝和浅拷贝。深拷贝会创建一个全新的、独立的对象副本,并包括其内部所有对象。而浅拷贝则会创建一个新的对象,但其内容是指向原始对象内容的引用。这一区别可能会影响一个对象的更改如何影响另一个对象。

在本篇博客文章中,我们将深入探讨Python中的深拷贝和浅拷贝,使用诸如list、dict、str、int等对象。我们将通过实际示例比较这两种拷贝方式,强调了解这些概念对于健壮编码实践的重要性。

深拷贝

使用copy模块

Python提供了copy模块,该模块包含deepcopy方法来创建对象的深拷贝。

python
import copy

original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[1][0] = 'changed'
print(original_list)  # 输出: [1, [2, 3], [4, 5]]

上述代码片段演示了使用deepcopy方法创建深拷贝。对deep_copied_list的更改不会影响original_list

浅拷贝

使用copy方法

可以使用copy模块的copy方法或使用对象的内建复制功能来创建浅拷贝。

python
import copy

original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = copy.copy(original_dict)
shallow_copied_dict['a'][0] = 'changed'
print(original_dict)  # 输出: {'a': ['changed', 2], 'b': [3, 4]}

此代码片段强调了对shallow_copied_dict的更改会反映在original_dict中,因为浅拷贝包含对原始对象内容的引用。

复制各种对象类型

在Python中,可对不同类型的对象(如列表、字典、字符串和整数)执行深拷贝和浅拷贝。这些复制方法的行为在Mutable和Immutable类型之间有所不同。以下是详细分解:

List

深拷贝

python
import copy

original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)

浅拷贝

python
original_list = [1, [2, 3], [4, 5]]
shallow_copied_list = original_list.copy()
shallow_copied_list[1][0] = 'changed'
print(original_list)  # 输出: [1, ['changed', 3], [4, 5]]

对于列表,深拷贝创建了一个完全独立的副本,而浅拷贝会导致嵌套对象的共享引用。

Dictionary

深拷贝

python
import copy

original_dict = {'a': [1, 2], 'b': [3, 4]}
deep_copied_dict = copy.deepcopy(original_dict)

浅拷贝

python
original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = original_dict.copy()
shallow_copied_dict['a'][0] = 'changed'
print(original_dict)  # 输出: {'a': ['changed', 2], 'b': [3, 4]}

对于字典,深拷贝创建了全新的对象,而浅拷贝会导致嵌套对象的引用。

String, Integer (Immutable)

深拷贝

python
original_str = "text"
deep_copied_str = copy.deepcopy(original_str)
original_int = 42
deep_copied_int = copy.deepcopy(original_int)

浅拷贝

python
original_str = "text"
shallow_copied_str = copy.copy(original_str)
original_int = 42
shallow_copied_int = copy.copy(original_int)

字符串和整数是不可变的,这意味着浅拷贝和深拷贝的行为相同,创建全新的对象。

摘要表格

| 对象类型 | 深

拷贝 | 浅拷贝 | Mutable / Immutable | |--------------|-----------------------------|----------------------------|---------------------| | List | 创建独立副本 | 对嵌套对象的引用共享 | Mutable | | Dictionary | 创建独立副本 | 对嵌套对象的引用共享 | Mutable | | String | 创建独立副本 | 创建独立副本 | Immutable | | Integer | 创建独立副本 | 创建独立副本 | Immutable |

了解如何与Python中的不同类型对象进行复制对于有效处理复杂数据结构至关重要。它提供了对对象如何复制和引用的控制,使代码更准确、更高效。


理解深拷贝和浅拷贝之间的差异对于在Python中操纵复杂数据结构至关重要。它允许对对象的复制和引用进行精确控制,使编码实践更加精简和高效。


常见问题解答

  1. 深拷贝和浅拷贝的主要区别是什么? 深拷贝创建一个全新的对象,而浅拷贝则创建一个新的对象,该对象引用原始对象的内容。
  2. 如何创建字典或列表的深拷贝? 可使用copy模块中的deepcopy方法来创建深拷贝。
  3. 浅拷贝是否适用于所有类型的对象? 浅拷贝与Mutable和Immutable对象的行为不同。理解这一行为在选择复制方法时至关重要。
  4. 对浅拷贝的更改会影响原始对象吗? 是的,对诸如列表和字典这样的Mutable对象的浅拷贝的更改可能会影响原始对象。
  5. 使用浅拷贝还是深拷贝更高效? 一般来说,浅拷贝更高效,因为它不重新创建整个对象。然而,浅拷贝和深拷贝之间的选择应取决于代码的具体要求。
© Copyright 2023 CLONE CODING