小編在整理python手冊(cè)的時(shí)候看到了淺復(fù)制(淺拷貝)與深復(fù)制(深拷貝)這兩個(gè)概念,很多小伙伴可能會(huì)好奇:都叫復(fù)制,能有什么區(qū)別?又不是打印機(jī),復(fù)印的時(shí)候存在墨跡深淺。那么淺復(fù)制和深復(fù)制到底是什么,有什么區(qū)別呢?且看小編細(xì)細(xì)道來。
淺復(fù)制與深復(fù)制的區(qū)別
淺復(fù)制和深復(fù)制主要是在對(duì)象的復(fù)制上出現(xiàn)的區(qū)別,我們知道復(fù)制就是將一個(gè)東西通過一定的手段獲得另一件完全相同的東西。那么一個(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ù),也就是說當(dāng)字典1被修改的時(shí)候,字典2中也會(huì)跟著改變。
小伙伴們會(huì)說了,這跟淺復(fù)制和深復(fù)制有什么關(guān)系?有,因?yàn)槿绻覀冎皇菃渭兊膹?fù)制字典2,其中的info復(fù)制的也是字典1的引用,也就是說,字典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ù)制,我們把它們稱為淺復(fù)制和深復(fù)制,也叫淺拷貝和深拷貝,他們的區(qū)別就在于對(duì)字典中對(duì)象的處理,淺拷貝只復(fù)制引用,而深拷貝會(huì)將對(duì)象的內(nèi)容復(fù)制成新的一份。
應(yīng)用
在字典的備份中,使用copy函數(shù)進(jìn)行備份的話,就是淺拷貝。
字典的深拷貝需要使用到copy模塊,在引入copy模塊后就可以使用deepcopy()方法來進(jìn)行深拷貝了。
import copy
dict2 = copy.deepcopy(dict1)