Python之深淺拷貝

拷貝就是拷貝,何來深淺之說?

Python中,對象的賦值,拷貝(深/淺拷貝)之間是有差別的,若是使用的時候不注意,就可能產生意外的結果python

其實這個是因爲共享內存致使的結果post

拷貝:原則上就是把數據分離出來,複製其數據,並之後修改互不影響。code

先看 一個非拷貝的例子

=賦值:數據徹底共享(=賦值是在內存中指向同一個對象,若是是可變(mutable)類型,好比列表,修改其中一個,另外一個一定改變對象

若是是不可變類型(immutable),好比字符串,修改了其中一個,另外一個並不會變blog

l1 = [1, 2, 3, ['aa', 'bb']]
l2 = l1
l2[0]='aaa'
l2[3][0]='bbb'
print(l1)  #['aaa', 2, 3, ['bbb', 'bb']]
print(id(l1)==id(l2))  #True

 l2 = l1 ,l1 徹底賦值給l2 ,l2的內存地址與l1 相同,即內存徹底指向內存

 

淺拷貝:數據半共享(複製其數據獨立內存存放,可是隻拷貝成功第一層)字符串

 

l1 = [1,2,3,[11,22,33]]
l2 = l1.copy()
print(l2) #[1,2,3,[11,22,33]]
l2[3][2]='aaa'
print(l1) #[1, 2, 3, [11, 22, 'aaa']]
print(l2) #[1, 2, 3, [11, 22, 'aaa']]
l1[0]= 0
print(l1) #[0, 2, 3, [11, 22, 'aaa']]
print(l2) #[1, 2, 3, [11, 22, 'aaa']]
print(id(l1)==id(l2)) #Flase

如上述代碼,l2淺拷貝了l1 ,以後l2把其列表中的列表的元素給修改,從結果看出,l1也被修改了。可是僅僅修改l1列表中的第一層元素,卻並無影響l2。it

比較一下l2與l1的內存地址:False,說明,l2在內存中已經獨立出一部分複製了l1的數據,可是隻是淺拷貝,第二層的數據並無拷貝成功,而是指向了l1中的第二層數據的內存地址,因此共享內存‘至關於‘’等號賦值’‘,因此就會有l2中第二層數據發生變化,l1中第二層數據也發生變化table

 

如圖,這就是淺拷貝的原理,l2拷貝l1的時候只拷貝了他的第一層,也就是在其餘內存中從新建立了l1的第一層數據,可是l2沒法拷貝l1的第二層數據,也就是列表中的列表,因此他就只能指向l1中的第二層數據class

由此,當修改l1中第二層數據的時候,淺拷貝l1的l2中的第二層數據也隨之發生改變 

深拷貝:數據徹底不共享(複製其數據完徹底全放獨立的一個內存,徹底拷貝,數據不共享)

 深拷貝就是完徹底全複製了一份,且數據不會互相影響,由於內存不共享。

import copy
l1 = [1, 2, 3, [11, 22, 33]]
l2 = copy.deepcopy(l1)
print(l1,l2)
l2[3][0] = 1111
print(l1,l2)

 因而可知深拷貝就是數據完徹底全獨立拷貝出來一份。不會由原先數據變更而變更

相關文章
相關標籤/搜索