在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是两种不同的复制对象的方法,它们在处理可变对象(如列表、字典等)时有着显著的区别。
1. 浅拷贝 (Shallow Copy)
浅拷贝是创建一个新对象,但这个新对象中的元素是原对象中元素的引用。换句话说,浅拷贝只复制了对象本身及其第一层内容(即最外层的对象),而内部的可变对象依然是与原对象共享的。
浅拷贝的方式
- 使用
copy
模块中的copy()
函数 - 使用对象的
copy()
方法(如列表、字典等) - 使用切片操作
[:]
(对列表有效)
import copy
# 浅拷贝示例
original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)
# 修改内部可变对象(原列表和浅拷贝共享的部分)
shallow_copied_list[2][0] = 99
print(original_list) # 输出: [1, 2, [99, 4]]
print(shallow_copied_list) # 输出: [1, 2, [99, 4]]
浅拷贝的特征:
- 原对象与浅拷贝对象共享内部的可变对象。
- 修改共享的可变对象时,会影响原对象和浅拷贝对象。
- 浅拷贝适合在不包含复杂嵌套结构的对象复制中使用。
2. 深拷贝 (Deep Copy)
深拷贝是创建一个新对象,并递归地复制所有子对象(即整个对象树)。因此,新对象与原对象完全独立,任何一方的修改都不会影响另一方。
深拷贝的方式
- 使用
copy
模块中的deepcopy()
函数
import copy
# 深拷贝示例
original_list = [1, 2, [3, 4]]
deep_copied_list = copy.deepcopy(original_list)
# 修改内部可变对象(原列表和深拷贝不共享的部分)
deep_copied_list[2][0] = 99
print(original_list) # 输出: [1, 2, [3, 4]]
print(deep_copied_list) # 输出: [1, 2, [99, 4]]
深拷贝的特征:
- 原对象与深拷贝对象完全独立,不共享内部可变对象。
- 修改深拷贝对象中的任何元素,不会影响原对象,反之亦然。
- 深拷贝适合用于复制复杂嵌套结构的对象。
3. 何时使用深拷贝与浅拷贝
- 浅拷贝:当你需要复制一个对象,并且这个对象内部没有嵌套其他可变对象(如列表或字典),或即使有也不打算修改它们时,使用浅拷贝即可。
- 深拷贝:当你需要复制一个包含复杂嵌套结构的对象,并且希望新对象与原对象完全独立时,应该使用深拷贝。
总结
- 浅拷贝:只复制对象本身及其第一层内容,内部嵌套的对象是共享的。
- 深拷贝:递归复制整个对象树,完全独立于原对象。
通过合理选择浅拷贝和深拷贝,可以在不同场景下高效地管理内存和数据的独立性。