Python学习-深浅拷贝
浅拷贝
先来看一段代码
1 a = [[1,2],3,4] 2 b = a.copy() 3 4 b[1] = 5 5 6 print(a) # [[1,2],3,4] 7 print(b) # [[1,2],5,4] 8 9 b[0][0] = 8 10 11 print(a) # [[8,2],3,4] 12 print(b) # [[8,2],3,4]
为什么改变b[1]时a不改变,而改变b[0][0]时a却改变了呢?
1 a = [[1, 2], 3, 4] 2 b = a.copy() 3 4 print(a,b) 5 print(id(a),id(b)) 6 print('*************') 7 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 8 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 9 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 10 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 11 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))
输出的结果为
[[1, 2], 3, 4] [[1, 2], 3, 4]
417276751688 417277950792
*************
a[0]: 417277949192 b[0]: 417277949192
a[0][0]: 1347055072 b[0][0]: 1347055072
a[0][1]: 1347055104 b[0][1]: 1347055104 a[1]: 1347055136
b[1]: 1347055136 a[2]: 1347055168 b[2]: 1347055168
1 a = [[1, 2], 3, 4] 2 b = a.copy() 3 b[0][0] = 8 4 print(a,b) 5 print(id(a),id(b)) 6 print('*************') 7 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 8 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 9 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 10 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 11 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))
当我们改变b[0][0] = 8 时,输出的结果为
[[8, 2], 3, 4] [[8, 2], 3, 4]
1093826309960 1093827509064
*************
a[0]: 1093827507464 b[0]: 1093827507464
a[0][0]: 1347055296 b[0][0]: 1347055296
a[0][1]: 1347055104 b[0][1]: 1347055104
a[1]: 1347055136 b[1]: 1347055136
a[2]: 1347055168 b[2]: 1347055168
如何解释呢?
我们可以画图分析一下


a[[1,2],3,4] 3,4是第一层 ,[1,2]是第二层
我们可以这样理解,在前拷贝时,只拷贝了第一层,而第二层是共享的,所以改变b[0][0]时,a的值页发生改变
深拷贝
通过copy模块里面的深拷贝函数deepcopy()
1 import copy 2 a = [[1, 2], 3, 4] 3 b = copy.deepcopy(a) 4 b[0][0] = 8 5 print(a,b) 6 print(id(a),id(b)) 7 print('*************') 8 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 9 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 10 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 11 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 12 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))
输出结果为
[[1, 2], 3, 4] [[8, 2], 3, 4]
1017751287688 1017751934728
*************
a[0]: 1017751287624 b[0]: 1017751934600
a[0][0]: 1347055072 b[0][0]: 1347055296
a[0][1]: 1347055104 b[0][1]: 1347055104
a[1]: 1347055136 b[1]: 1347055136
a[2]: 1347055168 b[2]: 1347055168
总结
1.Python中对象的赋值都是进行对象引用(内存地址)传递
2.使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
3.如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
浙公网安备 33010602011771号