031. 解释python中的深拷贝和浅拷贝
在 Python 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象拷贝方式,它们在处理可变对象(如列表、字典、集合等)时的行为有所不同。理解这两种拷贝方式的区别对于正确处理复杂数据结构非常重要。
1. 浅拷贝(Shallow Copy)
浅拷贝创建一个新对象,但只复制原对象的引用,而不是实际的数据。如果原对象包含可变对象(如列表、字典等),浅拷贝会复制这些可变对象的引用,而不是创建新的可变对象。
浅拷贝的实现方式
-
使用
copy
模块的copy()
函数。 -
使用切片操作(如
list[:]
)。 -
使用某些数据结构的内置方法(如
list.copy()
)。
示例代码
import copy
# 定义一个包含可变对象的列表
original_list = [1, 2, [3, 4]]
# 使用浅拷贝
shallow_copied_list = copy.copy(original_list)
# 修改原列表中的可变对象
original_list[2][0] = 'X'
print("原列表:", original_list) # 输出:[1, 2, ['X', 4]]
print("浅拷贝后的列表:", shallow_copied_list) # 输出:[1, 2, ['X', 4]]
2. 深拷贝(Deep Copy)
深拷贝创建一个新对象,并递归地复制原对象中的所有数据,包括嵌套的可变对象。深拷贝会创建完全独立的新对象,修改新对象不会影响原对象。
深拷贝的实现方式
- 使用
copy
模块的deepcopy()
函数。
示例代码
import copy
# 定义一个包含可变对象的列表
original_list = [1, 2, [3, 4]]
# 使用深拷贝
deep_copied_list = copy.deepcopy(original_list)
# 修改原列表中的可变对象
original_list[2][0] = 'X'
print("原列表:", original_list) # 输出:[1, 2, ['X', 4]]
print("深拷贝后的列表:", deep_copied_list) # 输出:[1, 2, [3, 4]]
区别总结
特性 | 浅拷贝 | 深拷贝 |
---|---|---|
定义 | 创建一个新对象,但只复制引用 | 创建一个新对象,并递归复制所有数据 |
可变对象 | 引用相同,修改一个会影响另一个 | 完全独立,修改一个不会影响另一个 |
实现方式 | copy.copy() 、切片操作、list.copy() |
copy.deepcopy() |
性能 | 速度快,内存占用少 | 速度慢,内存占用多 |
适用场景 | 简单数据结构或不包含嵌套可变对象 | 复杂数据结构或包含嵌套可变对象 |
适用场景
浅拷贝:
-
适用于简单数据结构(如只包含不可变对象的列表)。
-
适用于不包含嵌套可变对象的情况。
深拷贝:
-
适用于复杂数据结构(如包含嵌套可变对象的列表、字典等)。
-
适用于需要完全独立副本的情况。
注意事项
- 性能:浅拷贝通常比深拷贝更快,因为深拷贝需要递归复制所有数据。
- 嵌套对象:如果数据结构中包含嵌套的可变对象,建议使用深拷贝。
- 不可变对象: 对于不可变对象(如整数、字符串、元组等),浅拷贝和深拷贝的效果相同,因为不可变对象的引用不会改变。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)