1. 浅拷贝:
- 它创建一个新的对象,但对于原始对象内的子对象(如列表中的嵌套列表),只是复制了引用。例如:
import copy original_list = [1, 2, 3]
shallow_copied_list = copy.copy(original_list)
original_list.append(4)
print("原始列表:", original_list)
print("浅拷贝列表:", shallow_copied_list)
2. 深拷贝:
- 会递归地复制原始对象及其所有子对象,创建出完全独立的副本。
- 比如:
original_nested_list = [[1, 2], 3]
deep_copied_nested_list = copy.deepcopy(original_nested_list) original_nested_list[0].append(4)
print("原始嵌套列表:", original_nested_list)
print("深拷贝嵌套列表:", deep_copied_nested_list)
3. 浅拷贝和深拷贝主要有以下区别:
对于简单对象(如不可变对象)
表现类似,都创建了一个新的对象来表示。
对于复合对象(如包含嵌套结构的对象):
- 引用处理不同:浅拷贝只是复制了最外层对象和其直接包含的子对象的引用,而深拷贝会递归地复制所有层次的子对象,生成全新的、独立的对象结构。
- 修改影响不同:修改原始对象中的子对象,浅拷贝得到的对象对应的子对象也会受到影响,因为它们指向相同的内存地址;而深拷贝得到的对象中的子对象不会受到任何影响。
# 简单对象
a = 5
shallow_a = copy.copy(a)
deep_a = copy.deepcopy(a)
a = 10
print("浅拷贝后:", shallow_a)
print("深拷贝后:", deep_a)
# 列表
list1 = [1, 2, 3]
shallow_list1 = copy.copy(list1)
deep_list1 = copy.deepcopy(list1)
list1.append(4)
print("浅拷贝后:", shallow_list1)
print("深拷贝后:", deep_list1)
# 复合对象
list1 = [1, 2, [3, 4]]
shallow_list1 = copy.copy(list1)
deep_list1 = copy.deepcopy(list1)
list1[2].append(5)
print("浅拷贝后:", shallow_list1)
print("深拷贝后:", deep_list1)
可以看到,浅拷贝后修改原始列表中的嵌套列表,浅拷贝的结果也跟着变了,而深拷贝的结果则不受影响。