App下載

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

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

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

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

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

有這樣的兩個字典:

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

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

小伙伴們會說了,這跟淺復(fù)制和深復(fù)制有什么關(guān)系?有,因為如果我們只是單純的復(fù)制字典2,其中的info復(fù)制的也是字典1的引用,也就是說,字典1修改,字典2會跟著被修改,字典2的復(fù)制也會跟著被修改,如果我們的字典2的復(fù)制是為了備份,這樣的備份就不管用了。

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

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

應(yīng)用

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

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

import copy
dict2 = copy.deepcopy(dict1)


0 人點贊