您好,登錄后才能下訂單哦!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Python之深淺拷貝
一、淺拷貝
所謂淺拷貝,指的是對于某個(gè)對象,雖然創(chuàng)建了與該對象具有相同值的另一個(gè)對象,但是,這兩個(gè)對象內(nèi)部嵌套的對應(yīng)子對象全都是同一個(gè)對象。簡單地說,外部進(jìn)行了拷貝,內(nèi)部沒有拷貝。
以下方式得到的拷貝都是淺拷貝:
● 切片操作[:]
● 調(diào)用列表、字典、集合的方法copy()
● 調(diào)用內(nèi)置函數(shù)List()、dict()、set(4.
● 調(diào)用標(biāo)準(zhǔn)庫模塊copy中的函數(shù)copy()
import?copy??#?導(dǎo)入標(biāo)準(zhǔn)庫模塊copy L1?=?[1,[1,2,3],6] L2?=?L1.copy()?#?[1,?[1,?2,?3],?6]?使用list.copy() L2?=?L1[:]?#?[1,?[1,?2,?3],?6]?#?使用索引切片的方式 L2?=?list(L1)?#??[1,?2,?3],?6]?#?使用list()函數(shù)賦值 L2?=?copy.copy(L1)?#?[1,?[1,?2,?3],?6]??#?調(diào)用標(biāo)準(zhǔn)庫模塊copy中的函數(shù)copy() #?通過打印L1和L2的id可以看出,L2只拷貝了L1的外部,形成了一個(gè)和L1具有相同值的對象 #?L1和L2內(nèi)部值的id全都相同,即引用的同一內(nèi)存地址 print('L1_id:%d'?%?id(L1))?#?L1_id:140024932419056 print('L2_id:%d'?%?id(L2))?#?L2_id:140024932419456 print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:140024932419376 print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:140024932419376 print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466624 print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624 #?淺拷貝,對于列表內(nèi)部嵌套的可變類型對象,修改L1[1][1]值,L2[1][1]值也會跟著改變 #?實(shí)際上他們內(nèi)部都引用著同一個(gè)內(nèi)存id L1[1][1]?=?5 print(L1)?#?[1,?[1,?5,?3],?6] print(L2)?#?[1,?[1,?5,?3],?6] print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:140024932419376 print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:140024932419376 #?淺拷貝,對于列表內(nèi)部的不可變類型對象,修改L1[2], #?因?yàn)槭遣豢勺冾愋?,那么會重新調(diào)用一個(gè)值給予引用,L2[2]因此不受影響 L1[2]?=?8 print(L1)?#?[1,?[1,?5,?3],?8] print(L2)?#?[1,?[1,?5,?3],?6] print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466688 print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624
二、深拷貝
所謂深拷貝,指的是:對于某個(gè)對象,創(chuàng)建與該對象具有相同值的另一個(gè)對象,同時(shí),這兩個(gè)對象內(nèi)部嵌套的對應(yīng)可變子對象全都不是同一個(gè)對象。簡單地說,外部和內(nèi)部都進(jìn)行了拷貝。
深拷貝的方法:
● 調(diào)用標(biāo)準(zhǔn)庫模塊copy中的函數(shù)deepcopy()
import?copy??#?導(dǎo)入標(biāo)準(zhǔn)庫模塊copy L1?=?[1,[1,2,3],6] L2?=?copy.deepcopy(L1)?#?[1,?[1,?2,?3],?6] #?通過打印L1和L2的內(nèi)存地址可以看出,其外部進(jìn)行拷貝,L2是和L1具有相同值的新對象 #?對于內(nèi)部嵌套的可變類型對象,L1[1]和L2[1]內(nèi)存地址并不相同 #?對于內(nèi)部嵌套的不可變類型對象,L1[2]和L2[2]內(nèi)存地址相同,引用的同一內(nèi)存地址 print('L1_id:%d'?%?id(L1))?#?L1_id:139984573203792 print('L2_id:%d'?%?id(L2))?#?L2_id:139984573203952 print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:139984573203472 print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:139984573204512 print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466624 print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624 #?深拷貝,列表內(nèi)部嵌套的可變類型對象,修改L1[1][1]?為5不影響L2[1][1]的值, #?深拷貝是將L1和L2內(nèi)部可變類型對象的值引用的內(nèi)存地址分開來 L1[1][1]?=?5 print(L1)?#?[1,?[1,?5,?3],?6] print(L2)?#?[1,?[1,?2,?3],?6] print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:139984573203472 print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:139984573204512 #?深拷貝,對于列表內(nèi)部不可變類型對象,修改L1[2]?=?8,因?yàn)槭遣豢勺冾愋停詫1[2]重新賦值引用,不影響L2[2] L1[2]?=?8 print(L1)?#?[1,?[1,?5,?3],?8] print(L2)?#?[1,?[1,?2,?3],?6] print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466688 print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。