1 # File : learning_copy_and_deepcopy.py
2 # Datetime : 2022/4/10 0010 2:44
3 # 深浅拷贝
4 import copy
5
6 # 浅拷贝
7 # 文字说明:
8 """
9 在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,新对象里面的元素的地址和原对象里面的元素地址是相同的.
10 (可以这么理解list1=list.copy(),此时list和list1的id不同,但是内部元素的id是相同的)
11 在拷贝时,如果存在多层级(如列表内嵌套列表,字典等),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,
12 而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,
13 但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
14 """
15 # 代码演示说明:
16 list = [[1, 2, 3], "name", "age"]
17 list1 = list.copy() # 等同于list1 = copy.copy(list) 浅拷贝
18
19 # 判断两个列表name元素内存地址是否相同
20 if id(list[1]) == id(list1[1]):
21 print("变更前,True,两个列表元素引用内存地址相同")
22 else:
23 print("变更前,False,两个列表元素引用内存地址不同")
24 # 变更list1列表元素name为new_name
25 list1[1] = "new_name"
26 # 再次判断两个列表name元素内存地址是否相同
27 if id(list[1]) == id(list1[1]):
28 print("变更后,True,两个列表元素引用内存地址相同")
29 else:
30 print("变更后,False,两个列表元素引用内存地址不同")
31
32 # 此时测试list和list1的变化
33 print("list的元素为:", list)
34 print("list1的元素为:", list1)
35 # 测试结果:list和list1的元素相互不影响
36
37
38 # 测试深层列表内元素对象修改变化(嵌套在列表内的列表元素变更)
39 list2 = list.copy()
40 # 变更list1列表内列表[1, 2, 3]为[1, 2, 3456] 再次测试list和list1的变化
41 # 先测试一下列表list和list2内嵌套的列表元素的引用地址
42 if id(list[0]) == id(list2[0]):
43 print("变更前,True,两个列表元素引用内存地址相同")
44 else:
45 print("变更前,False,两个列表元素引用内存地址不同")
46 # 我们修改list2中的列表 的元素为3的 值变更为3456
47 list2[0][2] = 3456
48 # 此时我们再来测list和list2内嵌套的列表元素的引用地址
49 if id(list[0]) == id(list2[0]):
50 print("变更前,True,两个列表元素引用内存地址相同")
51 print("list中嵌套列表的引用内存地址id为", id(list[0]))
52 print("list2中嵌套列表的引用内存地址id为", id(list2[0]))
53 else:
54 print("变更前,False,两个列表元素引用内存地址不同")
55 print("list中嵌套列表的引用内存地址id为", id(list[0]))
56 print("list2中嵌套列表的引用内存地址id为", id(list2[0]))
57
58 # 深拷贝
59 # ,拷贝出来的新对象的地址和原对象是不一样的,深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象
60 # 代码演练
61
62 list3 = copy.deepcopy(list) # 深拷贝
63
64 # 测试列表list、list3内嵌套列表的内存地址是否相同
65 if id(list[0]) == id(list3[0]):
66 print("深拷贝---引用内存地址相同")
67 else:
68 print("深拷贝---引用内存地址不相同")
69 print("list中嵌套列表的引用内存地址id为", id(list[0]))
70 print("list3中嵌套列表的引用内存地址id为", id(list3[0]))