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()进行深拷贝

 

 

 

 

posted on 2018-01-20 10:56  elif_syh  阅读(117)  评论(0)    收藏  举报

导航