python中的浅拷贝与深拷贝——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