App下載

淺拷貝和深拷貝的區(qū)別?從python字典到對(duì)象引用

steven 2021-10-21 17:56:50 瀏覽數(shù) (2942)
反饋

小編在整理python手冊(cè)的時(shí)候看到了淺復(fù)制(淺拷貝)與深復(fù)制(深拷貝)這兩個(gè)概念,很多小伙伴可能會(huì)好奇:都叫復(fù)制,能有什么區(qū)別?又不是打印機(jī),復(fù)印的時(shí)候存在墨跡深淺。那么淺復(fù)制和深復(fù)制到底是什么,有什么區(qū)別呢?且看小編細(xì)細(xì)道來(lái)。

淺復(fù)制與深復(fù)制的區(qū)別

淺復(fù)制和深復(fù)制主要是在對(duì)象的復(fù)制上出現(xiàn)的區(qū)別,我們知道復(fù)制就是將一個(gè)東西通過(guò)一定的手段獲得另一件完全相同的東西。那么一個(gè)對(duì)象在進(jìn)行復(fù)制的時(shí)候應(yīng)該也是如此,但因?yàn)橐玫拇嬖?,這就有了一定的區(qū)別,以字典為例:

有這樣的兩個(gè)字典:

dict1 = {'Name': 'W3CSchool', 'Age': 7, 'Class': 'First',}
dict2 = {'info':dict1,'uid':12444}

我們可以看到,字典2中引用了字典1,實(shí)際上在字典2中保存的是字典1的引用地址而不是具體數(shù)據(jù),也就是說(shuō)當(dāng)字典1被修改的時(shí)候,字典2中也會(huì)跟著改變。

小伙伴們會(huì)說(shuō)了,這跟淺復(fù)制和深復(fù)制有什么關(guān)系?有,因?yàn)槿绻覀冎皇菃渭兊膹?fù)制字典2,其中的info復(fù)制的也是字典1的引用,也就是說(shuō),字典1修改,字典2會(huì)跟著被修改,字典2的復(fù)制也會(huì)跟著被修改,如果我們的字典2的復(fù)制是為了備份,這樣的備份就不管用了。

所以,還存在著另一種復(fù)制,他在復(fù)制的時(shí)候不是復(fù)制字典1的引用,而是直接將字典1的內(nèi)容復(fù)制后加入字典2,所以這樣的字典2的復(fù)制就不是復(fù)制字典1的引用了,當(dāng)我們修改字典1的時(shí)候,字典2會(huì)跟著改變,但字典2的復(fù)制不會(huì)跟著改變。

為了區(qū)分這兩種復(fù)制,我們把它們稱(chēng)為淺復(fù)制和深復(fù)制,也叫淺拷貝和深拷貝,他們的區(qū)別就在于對(duì)字典中對(duì)象的處理,淺拷貝只復(fù)制引用,而深拷貝會(huì)將對(duì)象的內(nèi)容復(fù)制成新的一份。

應(yīng)用

在字典的備份中,使用copy函數(shù)進(jìn)行備份的話(huà),就是淺拷貝。

字典的深拷貝需要使用到copy模塊,在引入copy模塊后就可以使用deepcopy()方法來(lái)進(jìn)行深拷貝了。

import copy
dict2 = copy.deepcopy(dict1)


0 人點(diǎn)贊