python中包含復(fù)制 淺拷貝與深拷貝
1.復(fù)制
復(fù)制沒有拷貝子對象反砌,未開辟新內(nèi)存空間,也沒有產(chǎn)生新object,所以原始數(shù)據(jù)改變披蕉,復(fù)制后的object也會改變
①最常見的賦值操作就屬于復(fù)制
python中賦值操作實(shí)質(zhì)就是對object的引用,是對當(dāng)前object的引用的拷貝,不是對當(dāng)前object的拷貝
2.淺拷貝shallow copy
②copy模塊中的copy.copy()屬于淺拷貝操作函數(shù)
3.深拷貝deep copy
包含對象里面的自object的拷貝,劃分一塊新的內(nèi)存空間,生成一個新object,所以原始對象的改變不會造成深拷貝里任何子元素的改變
>>> aa=['3','45','456'] #列表
>>> bb=aa #直接賦值
>>> cc=copy.copy(aa) #淺拷貝
>>> dd=copy.deepcopy(cc) #深拷貝
>>> id(aa)
45129096L
>>> id(bb)
45129096L
>>> id(cc)
45185160L
>>> id(dd)
45129032L
4.copy() 與deepcopy()
針對簡單變量,兩種操作是沒有區(qū)別的,在面對復(fù)雜object時有區(qū)別然走,所謂復(fù)雜object,是指object中含其他object(如復(fù)雜的 list 和 class)。
由 shallow copy 創(chuàng)建的新object開辟了新的空間寒跳,但新object里面的子object是對舊object引用的拷貝,依然指向自己在原來本體中對應(yīng)的子object。而 deep copy 建立的復(fù)雜object中竹椒,存儲的則是本體中子object的 copy童太,并且會層層如此 copy 到底,相當(dāng)于對object里的各層進(jìn)行遞歸copy。
In [1]: import copy
In [2]: a=['1','2','3',['aa','bb']]
In [3]: b=a
In [4]: c=copy.copy(b)
In [5]: d=copy.deepcopy(a)
In [6]: c=copy.copy(a)
In [7]: a.append('4')
In [8]: a[3].append('cc')
In [9]: a
Out[9]: ['1', '2', '3', ['aa', 'bb', 'cc'], '4']
In [10]: b
Out[10]: ['1', '2', '3', ['aa', 'bb', 'cc'], '4']
In [11]: c
Out[11]: ['1', '2', '3', ['aa', 'bb', 'cc']]
In [12]: d
Out[12]: ['1', '2', '3', ['aa', 'bb']]
注:
①其中a.append('4')在淺拷貝和深拷貝后生成的新object都不會因?yàn)槔蟧bject變化而變化,故a中尾部插入數(shù)據(jù)不對新object c和d 產(chǎn)生影響
② a[3].append('cc'),在淺拷貝中,新object c中的子對象['aa','bb']依然是對a中['aa','bb']的子object的引用,c中子對象會因a子object的變化而變化,故c中子object變?yōu)閇'aa', 'bb', 'cc'],在深拷貝中d的object及object內(nèi)部的,是完全對立的地址空間,完全不改變