深拷贝与浅拷贝简介
- copy.copy():浅拷贝是创建一个新对象,但是新对象的元素是原对象的引用。也就是说,新对象和原对象共享同一块内存空间。当原对象的元素发生改变时,新对象的元素也会随之改变。
- copy.deepcopy():深拷贝是创建一个新对象,并且新对象的元素也是新创建的对象,而不是原对象的引用。也就是说,新对象和原对象完全独立,互不影响。当原对象的元素发生改变时,新对象的元素不会受到影响。
对非嵌套类型数据的处理
import copy
list1 = [11, 12]
list2 = copy.copy(list1)
print("list1:" + str(id(list1)))
print("list2:" + str(id(list2)))
list1.append(13)
print("list1:" + str(id(list1)))
print(list1)
print(list2)
list1 = [11, 12]
list2 = copy.deepcopy(list1)
print("list1:" + str(id(list1)))
print("list2:" + str(id(list2)))
list1.append(13)
print("list1:" + str(id(list1)))
print(list1)
print(list2)
- 可以得出结论:
对于非嵌套列表,深拷贝和浅拷贝的处理结果是一致的,都会创建一个与原始对象完全独立的新对象,修改原始对象或拷贝对象中的任何一个都不会对另一个产生影响
,这是因为非嵌套列表中的元素都是基本数据类型,不涉及到嵌套对象的复制。
对嵌套类型数据的处理
import copy
list1 = [11, 12, [13, 14]]
list2 = copy.copy(list1)
print("list1:" + str(id(list1)))
print("list2:" + str(id(list2)))
list1[2].append(15)
print("list1:" + str(id(list1)))
print(list1)
print(list2)
import copy
list1 = [11, 12, [13, 14]]
list2 = copy.deepcopy(list1)
print("list1:" + str(id(list1)))
print("list2:" + str(id(list2)))
list1[2].append(15)
print("list1:" + str(id(list1)))
print(list1)
print(list2)
- 可以得出结论:
对于嵌套列表,深拷贝和浅拷贝的处理结果是不同的
。浅拷贝只复制了原始列表的引用,所以修改原始列表中的嵌套列表中的对象时,浅拷贝列表也会受到影响。而深拷贝递归地复制了原始列表及其所有嵌套的列表中的对象,所以修改原始列表中的嵌套列表中的对象时,深拷贝列表不受影响。