在Python中,浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是复制对象的两种方式,它们在处理复杂对象(如包含其他对象的对象)时表现出不同的行为。
浅拷贝
浅拷贝创建一个新对象,但不会递归复制对象内部的子对象。子对象的引用会被复制到新对象中,因此原始对象和拷贝对象会共享内部的子对象。
import copy
# 创建一个包含其他列表的列表
original_list = [[1, 2, 3], [4, 5, 6]]
# 创建浅拷贝
shallow_copied_list = copy.copy(original_list)
# 修改原始列表中的子列表
original_list[0][0] = 'X'
print(original_list) # 输出: [['X', 2, 3], [4, 5, 6]]
print(shallow_copied_list) # 输出: [['X', 2, 3], [4, 5, 6]]
在这个例子中,修改original_list中的一个子元素同时影响了shallow_copied_list,因为两者共享相同的子对象。
深拷贝
深拷贝创建一个新对象,并递归复制原始对象内部的所有子对象。结果是创建了一个完全独立的对象,不与原始对象共享任何内容。
# 创建深拷贝
deep_copied_list = copy.deepcopy(original_list)
# 修改原始列表中的子列表
original_list[0][0] = 'Y'
print(original_list) # 输出: [['Y', 2, 3], [4, 5, 6]]
print(deep_copied_list) # 输出: [['X', 2, 3], [4, 5, 6]]
在这个例子中,即使修改original_list,deep_copied_list也保持不变,因为它是一个完全独立的拷贝。
原理
浅拷贝:只复制对象本身和对象内最顶层的内容,内部嵌套的对象不会被复制,只复制对这些嵌套对象的引用。
深拷贝:复制对象及其所有嵌套的对象,递归地创建所有子对象的拷贝。深拷贝生成的对象完全独立于原始对象。