對于各種編程語言,深淺拷貝總可以讓初學者頭疼不已。而Python--這門十分受歡迎的語言也不例外。下面,分享下自己對Python深淺拷貝的理解。
- 淺復制后,兩個變量同時變化
- 深復制后,兩個變量獨立
單變量
在編程中,賦值“=”這個操作很常見,但是它底層的含義學問很大。稍有不注意,就給你找麻煩。賦值“=”類似于深復制。直接上code
>>> x = 10 >>> y = x >>> x, y 10, 10 >>> x = 0 >>> print(x, y) 0, 10
發現,y的值沒有變化?。?!也說明y = x 這個賦值操作并沒有實現把x的地址賦值給y,而是創造了一個引用。x,y的值是獨立的,不會相互影響。直接上圖助你理解引用。
- 10賦值給x,10的引用給了x
- y=x,給10創造了一個引用別名
- x=0,0的引用給了x,從而不會影響y的值
復雜數據結構,例如 List, Array
但對于復雜數據結構的賦值和單變量的不一樣,它是一種淺復制。直接上code
>>>ls1 = [0,1,2] >>>ls2 = ls1 >>>ls1.Append(-1) >>> ls1, ls2 [0,1,2,-1],[0,1,2,-1]
賦值后,兩個變量是同時改變的。這和單變量的不同。
可以這樣理解,對于復雜數據結構的賦值,其實是數據結構地址的賦值,即ls1和ls2共享了這個list的地址,都指向這個數據結構。所以,一個變化后,另一個也會變化。類比說明下,假設黃山市和徽州市(徽州更好聽)是同一個地方的名稱,都指向同一個地點?;罩菔袑崿F了小康,那黃山市肯定也是小康了。
深復制
那么,如何實現復雜數據結構的復制呢?使用Python的一個包:copy.
- copy.copy() 實現淺復制
- copy.deepcopy() 實現深復制
>>>import copy >>> ls1 = [0,1,2] >>>ls2 = copy.deepcopy(ls1) >>>ls1.append(-1) >>>ls1,ls2 ([0, 1, 2, -1], [0, 1, 2])