python中的浅拷贝与深拷贝——copy()
1、copy()方法用來拷貝列表元素
1 a = [1, 2, 3] 2 # 拷貝 3 b = a.copy() 4 print('a = ', a, '\n', 'b = ', b) 5 6 # 執(zhí)行結(jié)果: 7 # a = [1, 2, 3] 8 # b = [1, 2, 3]?
2、copy()方法執(zhí)行的是深拷貝,b = a.copy(),b將指代內(nèi)存中的另一個(gè)與a不同的位置, 在不存在列表嵌套的情況下,在a或者b任何一方的任何操作對(duì)另一方?jīng)]有影響
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 # 執(zhí)行結(jié)果: 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(),結(jié)果與情況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 # 執(zhí)行結(jié)果: 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]可以看見,凡是對(duì)列表內(nèi)嵌套的列表的值進(jìn)行了修改,那么無論修改a還是b都會(huì)對(duì)另一方有影響,如修改a[1][0]和b[1][2]則a和b的[1][0]和[1][2]位置的值都被修改了,而非嵌套列表的值則無影響,如修改b[2]對(duì)a[2]的值沒有影響。
出現(xiàn)這種情況的原因是,主列表a只存儲(chǔ)了嵌套列表在內(nèi)存中的地址,而不是嵌套列表的數(shù)據(jù),copy()方法也只是將該地址復(fù)制到b中,但是由于a和b的這兩個(gè)地址都指向內(nèi)存的同一區(qū)域,故對(duì)該區(qū)域的任何操作都會(huì)對(duì)a和b有共同影響
?
4、有一個(gè)copy模塊提供與python內(nèi)置的copy()方法相同的功能
1 import copy 2 3 a = [1, [2, 2, 2], 3] 4 # 調(diào)用copy模塊的copy函數(shù) 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 # 執(zhí)行結(jié)果: 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()方法進(jìn)行徹底的深度拷貝,即不管有沒有列表嵌套,在任何一方的任何操作都對(duì)另一方?jīng)]有影響
1 import copy 2 3 a = [1, [2, 2, 2], 3] 4 # 調(diào)用copy模塊的deepcopy函數(shù) 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 # 執(zhí)行結(jié)果: 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
轉(zhuǎn)載于:https://www.cnblogs.com/latup/p/9573051.html
總結(jié)
以上是生活随笔為你收集整理的python中的浅拷贝与深拷贝——copy()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unittest框架学习笔记
- 下一篇: 27_多线程_第27天(线程安全、线程同