Python 浅拷贝 vs. 深拷贝
理解浅拷贝与深拷贝的区别,有助于避免意外的数据变更。
- 浅拷贝只复制列表的顶层元素,列表中的嵌套列表或可变对象若引用同一对象,不会被复制。对这些可变对象的修改会同时影响原始列表与副本列表。
- 深拷贝会递归复制所有元素,包括嵌套列表与可变对象,生成相互独立的副本。对副本中嵌套对象的修改不会影响原始列表。
我建议浅拷贝使用 copy.copy() 函数,深拷贝使用 copy.deepcopy() 函数。
|
方法 |
浅拷贝 |
深拷贝 |
|
copy() |
✓ |
✗ |
|
list() 构造函数 |
✓ |
✗ |
|
列表切片 [:] |
✓ |
✗ |
|
copy.copy() |
✓ |
✗ |
|
copy.deepcopy() |
✗ |
✓ |
如何在 Python 中复制嵌套列表
在处理嵌套列表或更复杂的数据结构时,需要更先进的列表复制方法。下面来看几种处理嵌套列表的技巧。
使用 copy.copy()
copy 模块提供了 copy() 函数,用于创建列表的浅拷贝。相比使用 list() 构造函数或列表切片 [:],copy() 更为显式。当您希望突出强调“创建浅拷贝”以提升可读性时,可以使用此方法。
下面的示例演示了如何对嵌套列表进行浅拷贝。由于嵌套列表仍是同一个对象,代码将打印 [1, 2, [99, 4]]。
# Import the copy module to access the copy.copy() function
import copy
# Original list with nested structure
original_list = [1, 2, [3, 4]]
# Create a shallow copy using copy.copy()
shallow_copied_list = copy.copy(original_list)
# Modifying the nested list in the copied list
shallow_copied_list[2][0] = 99
print(original_list)
[1, 2, [99, 4]]
使用 copy.deepcopy()
deepcopy() 函数同样由 copy 模块提供。该函数会创建列表的深拷贝,不仅复制列表本身,还会复制所有嵌套对象。在处理包含可变对象的列表时,deepcopy() 非常重要,它能确保对副本列表的修改不会影响原始列表。
下面的代码将打印 [1, 2, [3, 4]]。
# Import the copy module to access the copy.deepcopy() function
import copy
# Original list with nested structure
original_list = [1, 2, [3, 4]]
# Create a deep copy using copy.deepcopy()
deep_copied_list = copy.deepcopy(original_list)
# Modifying the nested list in the copied list
deep_copied_list[2][0] = 99
print(original_list)
[1, 2, [3, 4]]
结论
掌握如何在 Python 中复制列表对于高效进行数据处理至关重要。本教程介绍了在 Python 中复制列表的多种方法,并对浅拷贝与深拷贝的差异进行了说明。作为数据分析师,您需要结合具体需求选择合适的复制技术。建议您动手练习文中方法,以更好地理解其适用场景。
学习 DataCamp 的Python Programming技能路径,掌握更出色的编程技巧。同时也推荐查看我们的Python Developer和Data Analyst with Python职业路径,持续构建实用且与岗位相关的技能。

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。
常见问题解答
浅拷贝与深拷贝有什么区别?
浅拷贝方法会创建一个新列表,但其值引用与原始列表相同的对象,因此对副本列表中对象的更改会影响原始列表。深拷贝会创建一个新列表,并将原始列表中的值递归插入到新列表中,因此对副本列表中嵌套对象的更改不会影响原始列表。
在 Python 中,创建浅拷贝的方法有哪些?
您可以使用 copy() 方法、列表切片 [:]、list() 构造函数,或 copy 模块中的 copy() 函数来创建列表的浅拷贝。
如何创建列表的深拷贝?
您可以使用 copy 模块中的 deepcopy() 函数创建列表的深拷贝。
Python 列表是用于存储一组条目的强大数据结构。在处理数据时,复制列表的方法至关重要,因为它可以在对副本进行操作的同时保留原始列表。在本教程中,我将通过实用示例讲解复制列表的基础与高级技巧。
在阅读不同示例之前,建议您先学习 DataCamp 的Introduction to Python课程,掌握 Python 基础知识,包括不同的Python 数据结构。同时也可以参考Python 初学者速查表,便于查阅不同函数与方法。
“Python 使用复印机。”图片来自 Dall-E。
快速解答:如何在 Python 中复制列表
下面的示例展示了如何使用
copy()方法复制列表。请注意,即使修改了副本列表,原始列表仍保持不变。代码将打印[1, 2, 3]。更多在 Python 中复制列表的技巧
在介绍不同的复制技巧之前,先说明为什么不使用赋值运算符
=。之所以不用=,是因为这样做并不会真正创建列表的副本,赋值运算符只会创建对列表的引用。在下面的示例中,赋值后
original_list和reference_to_original_list实际上引用的是同一个列表。在这种情况下,对副本列表的任何修改都会影响原始列表,反之亦然。这是因为两个列表存储在同一块内存中。现在,让我们来看一看真正复制列表的不同方法。
使用 copy() 方法
copy()是用于创建列表浅拷贝的内置方法,可在 Python 3.3 及以上版本使用。该方法只复制列表的顶层结构。下面给出copy()方法的语法。在下面的示例中,代码将打印
[1, 2, 3, 4]。使用 list() 构造函数
list()构造函数可基于现有列表创建一个新列表,包含原始列表的所有元素。这在需要创建一个新的列表对象、并确保对副本列表的更改不会影响原始列表时非常有用。下面的代码将打印[1, 2, 3]。使用切片 [:]
列表切片
[:]是创建列表浅拷贝的一种简洁方式。该方法效率较高,因为它在 Python 中以较底层方式实现。其语法如下。下面的代码将打印
[1, 2, 3]。在此处,我们使用切片来包含列表中的所有元素;在其他场景中,也可以通过指定起止索引,用切片创建子列表。