python中的浅拷贝与深拷贝——copy()

1、copy()方法用来拷贝列表元素

1 a = [1, 2, 3]
2 # 拷贝
3 b = a.copy()
4 print('a = ', a, '\n', 'b = ', b)
5 
6 # 执行结果:
7 # a = [1, 2, 3] 
8 # b = [1, 2, 3]

 

2、copy()方法执行的是深拷贝,b = a.copy(),b将指代内存中的另一个与a不同的位置, 在不存在列表嵌套的情况下,在a或者b任何一方的任何操作对另一方没有影响

 1 a = [1, 2, 3]
 2 # 拷贝
 3 b = a.copy()
 4 print('a = ', a, '\n', 'b = ', b)
 5 
 6 #修改a[0]和b[1]的值
 7 a[0] = 0
 8 b[1] = 1
 9 print('a = ', a, '\n', 'b = ', b)
10 
11 
12 # 执行结果:
13 # a = [1, 2, 3]
14 # b = [1, 2, 3]
15 
16 # 修改a[0]和b[1]后:
17 # a =  [0, 2, 3] 
18 # b =  [1, 1, 3]

 

3、存在列表嵌套情况下的copy(),结果与情况2有不同

 1 a = [1, [2, 2, 2], 3]
 2 # 拷贝
 3 b = a.copy()
 4 print('a = ', a, '\n', 'b = ', b)
 5 
 6 #修改a[1][0]、b[1][2]和b[2]的值
 7 a[1][0] = 0
 8 b[1][2] = 0
 9 b[2] = 1
10 print('a = ', a, '\n', 'b = ', b)
11 
12 
13 # 执行结果:
14 # a =  [1, [2, 2, 2], 3] 
15 # b =  [1, [2, 2, 2], 3]
16 
17 # 修改a[1][0]、b[1][2]和b[2]后:
18 # a =  [1, [0, 2, 0], 3] 
19 # b =  [1, [0, 2, 0], 1]

可以看见,凡是对列表内嵌套的列表的值进行了修改,那么无论修改a还是b都会对另一方有影响,如修改a[1][0]和b[1][2]则a和b的[1][0]和[1][2]位置的值都被修改了,而非嵌套列表的值则无影响,如修改b[2]对a[2]的值没有影响。

出现这种情况的原因是,主列表a只存储了嵌套列表在内存中的地址,而不是嵌套列表的数据,copy()方法也只是将该地址复制到b中,但是由于a和b的这两个地址都指向内存的同一区域,故对该区域的任何操作都会对a和b有共同影响

 

4、有一个copy模块提供与python内置的copy()方法相同的功能

 1 import copy
 2 
 3 a = [1, [2, 2, 2], 3]
 4 # 调用copy模块的copy函数
 5 b = copy.copy(a)
 6 print('a = ', a, '\n', 'b = ', b)
 7 
 8 #修改a[1][0]、b[1][2]和b[2]的值
 9 a[1][0] = 0
10 b[1][2] = 0
11 b[2] = 1
12 print('a = ', a, '\n', 'b = ', b)
13 
14 
15 # 执行结果:
16 # a =  [1, [2, 2, 2], 3]
17 # b =  [1, [2, 2, 2], 3]
18 
19 #修改a[1][0]、b[1][2]和b[2]后:
20 # a =  [1, [0, 2, 0], 3]
21 # b =  [1, [0, 2, 0], 1]

 

5、可使用copy模块的deepcopy()方法进行彻底的深度拷贝,即不管有没有列表嵌套,在任何一方的任何操作都对另一方没有影响

 1 import copy
 2 
 3 a = [1, [2, 2, 2], 3]
 4 # 调用copy模块的deepcopy函数
 5 b = copy.deepcopy(a)
 6 print('a = ', a, '\n', 'b = ', b)
 7 
 8 #修改a[1][0]、b[1][2]和b[2]的值
 9 a[1][0] = 0
10 b[1][2] = 0
11 b[2] = 1
12 print('a = ', a, '\n', 'b = ', b)
13 
14 
15 # 执行结果:
16 # a =  [1, [2, 2, 2], 3]
17 # b =  [1, [2, 2, 2], 3]
18 
19 #修改a[1][0]、b[1][2]和b[2]后:
20 # a =  [1, [0, 2, 2], 3]
21 # b =  [1, [2, 2, 0], 1]

 

参考自:https://blog.csdn.net/lhw413/article/details/72807834

posted @ 2018-09-02 10:45  Latuper  阅读(514)  评论(0编辑  收藏  举报