浅拷贝 和 深拷贝

时间:2021-08-21 19:33:12
 1  #0 1 2 3 4 5 6 7 8 9 10 11
 2    li = [1,1,2,2,3,3,4,5,6,7,8,9]
 3 #循环一次 #[1,2,2,3,3,4,5,6,7,8,9]
 4            #0 1 2 3 4 5 6 7 8 9 10
 5 for i in li:
 6     if i%2!=0:
 7         li.remove(i)
 8 print(li)
 9 # 运行结果:[1, 2, 2, 3, 4, 6, 8]
10 
11 #循环删除list的时候,都会出现这样的问题
12 #循环的时候,不要删除元素,下标会错乱
13 
14 #解决办法
15 li = [1,1,2,2,3,3,4,5,6,7,8,9]
16 # l2 = li
17 l2 = li[:]
18 print(id(li)) #查看内存地址
19 print(id(l2))
20 # l2 = [1,1,2,2,3,3,4,5,6,7,8,9]
21 for i in l2:
22     if i%2!=0:
23         li.remove(i)
24 print(li)
25 # 运行结果:[2, 2, 4, 6, 8]  正确的
26 
27 #深拷贝   不同的内存地址 不相互影响
28 li = [1,1,2,2,3,3,4,5,6,7,8,9]
29 l2 = li[:]
30 #浅拷贝   指向相同的内存地址 相互影响
31 li = [1,1,2,2,3,3,4,5,6,7,8,9]
32 l2 = li
33 
34 #深拷贝和浅拷贝的区别,浅拷贝不会开辟新的内存地址,深拷贝会开辟新的内存地址
35 
36 import copy
37 d = {'name':'bai','age':28}
38 #d1 = d  #浅拷贝
39 d1=copy.deepcopy(d) #深拷贝
40 d1['age']=12
41 
42 print(id(d))
43 print(id(d1))
44 print(d)
45 print(d1)
46 运行结果:2962609174280
47 2962610675072
48 {'name': 'bai', 'age': 28}
49 {'name': 'bai', 'age': 12}
50 
51 ====================================================================
52 
53 import copy
54 d = {'name':'bai','age':[3,4,5]}
55 #d1 = d  #浅拷贝
56 d1=copy.copy(d)  #还是浅拷贝  在深入一层的时候就是浅拷贝了
57 d1['age'].append(19)
58 print(id(d))
59 print(id(d1))
60 print(d)
61 print(d1)
62 
63 运行结果:1839810967304
64                   1839810967376
65 {'name': 'bai', 'age': [3, 4, 5, 19]}
66 {'name': 'bai', 'age': [3, 4, 5, 19]}