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()
性能 速度快,内存占用少 速度慢,内存占用多
适用场景 简单数据结构或不包含嵌套可变对象 复杂数据结构或包含嵌套可变对象

适用场景

浅拷贝

  • 适用于简单数据结构(如只包含不可变对象的列表)。

  • 适用于不包含嵌套可变对象的情况。

深拷贝

  • 适用于复杂数据结构(如包含嵌套可变对象的列表、字典等)。

  • 适用于需要完全独立副本的情况。

注意事项

  1. 性能:浅拷贝通常比深拷贝更快,因为深拷贝需要递归复制所有数据。
  2. 嵌套对象:如果数据结构中包含嵌套的可变对象,建议使用深拷贝。
  3. 不可变对象: 对于不可变对象(如整数、字符串、元组等),浅拷贝和深拷贝的效果相同,因为不可变对象的引用不会改变。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)