Python 中的浅拷贝和深拷贝

17 Mar 2025 | 5 分钟阅读

在本教程中,我们将学习如何使用 Python 脚本创建浅拷贝和深拷贝。通常,我们使用 =(赋值运算符)来创建 Python 对象的副本。让我们理解与在 Python 中创建副本相关的完整概念。

Python 中的拷贝

众所周知,赋值运算符用于创建 Python 对象的副本,但事实并非如此;它仅在目标和对象之间创建绑定。当我们使用赋值运算符时,它不会创建新对象,而是创建一个共享旧对象引用的新变量。

当我们希望在不修改原始对象的同时进行更改时,副本会很有帮助。用户还倾向于创建副本以处理可变对象。

让我们理解下面的例子。

示例 -

输出

Old List: [[1, 2, 3], [4, 5, 4], [7, 8, 'a']]
ID of Old List: 1909447368968
New List: [[1, 2, 3], [4, 5, 4], [7, 8, 'a']]
ID of New List: 1909447368968

解释 -

在上面的输出中,我们可以看到变量 list1 和 list2 共享相同的 id 1909447368968。

如果我们更改 list1 或 list2 中的任何值,更改将同时反映在两者中。

Python 中的拷贝类型

主要目的是创建 Python 对象的副本,我们可以修改副本而不更改原始数据。在 Python 中,有两种创建副本的方法。

  • 浅拷贝
  • 深拷贝

我们将使用 copy 模块来创建上述副本。

copy 模块

copy 模块用于创建浅拷贝和深拷贝。让我们看看每种方法。

浅拷贝

浅拷贝是对象的副本,它存储原始元素的引用。它创建一个新的集合对象,然后用原始对象中找到的子对象的引用填充它。

它复制嵌套对象的引用,但不创建嵌套对象的副本。因此,如果我们对对象副本进行任何更改,更改将反映在原始对象中。我们将使用 copy() 函数来实现它。

示例 -

输出

The original elements before shallow copying
1 7 [3, 5] 8 
The original elements after shallow copying
1 7 [10, 5] 8

在上面的代码中,我们更改了 list1,该更改反映在另一个列表中。

示例 - 2

输出

Old list: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
New list: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

解释 -

在上面的代码中,我们创建了 list1 的浅拷贝。新创建的 list2 包含存储在 list1 中的原始嵌套对象的引用。然后我们将 [13, 14, 15] 追加到旧列表中,而子列表未复制到新列表中。

Python 中的深拷贝

深拷贝是一个过程,我们在其中创建一个新对象并递归地添加复制的元素。我们将使用 copy 模块中的 deecopy() 方法。将创建原始对象及其所有对象的独立副本。让我们通过以下示例进行理解。

示例 -

输出

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

解释 -

在上面的输出中,我们可以看到 z 是我们使用 deecopy() 方法创建的 x 的克隆。如果我们更改其中一个子对象,它不会影响原始对象。

在深拷贝中,两个对象完全独立。列表 x 被递归地克隆,包括其所有子对象。

示例 - 2

输出

The original list: 
0 [1, 2] [3, 5] 4 
The new list after deep copying: 
0 [8, 2] [3, 5] 4 
The original elements:
0 [1, 2] [3, 5] 4

复制任意 Python 对象

我们还可以使用 copy 方法复制任意 Python 对象,包括自定义类。可以使用 copy.copy()copy.deepcopy() 方法来复制任何对象。

让我们理解下面的例子。

示例 -

输出

Func_new(50, 56)
Func_new(50, 56)
False
False

解释 -

在上面的代码中,我们创建了一个名为 Func_new 的用户定义类,并定义了 __repr__() 来检查对象。接下来,我们使用 copy 模块创建了浅拷贝。我们实例化了该类并检查了原始对象及其浅拷贝。

注意事项

复合对象是浅拷贝和深拷贝之间的主要区别。包含其他对象的对象,例如列表或类实例,称为列表或类实例。

  • 浅拷贝创建一个新的复合对象,然后添加对原始对象中找到的对象的引用。
  • 深拷贝创建一个新的复合对象,然后添加对原始对象中找到的对象的引用。
  • 我们可以使用 copy 模块复制任意对象(包括自定义类)。

下一主题Atom Python