初探python物件複製問題的深拷貝和淺拷貝
前階段學習python時遇到物件拷貝的問題,感覺有個不小的坑,於是乎搜了一下網上相關部落格的介紹,然而總覺得敘述太長,不夠簡潔。本文通過總結前人經驗,並根據自己的理解,簡單談一談python中的拷貝小坑。
python中實現物件複製的方法大致有3種:簡單粗暴直接‘=’賦值、淺拷貝和深拷貝,下面我們一一來看:
首先是直接賦值。先來看一個例子:
>>> n0 = [0,1,2,[30,31,[320,321]]]
>>> n1 = n0
>>> n0[1] = 11
>>> n1
[0, 11, 2, [30, 31, [320, 321]]]
>>> n0[3 ][1] = 3111
>>> n1
[0, 11, 2, [30, 3111, [320, 321]]]
從這個例子可以看出,賦值就是原物件變成啥我就變成啥。打個比方,今天上課講了python,aa上課記了筆記,hh生病曠課。但是hh知道aa記了筆記,想要檢視只需要去找aa借筆記就行了,如果aa修改了筆記內容,那麼hh去借就只能看到修改後的筆記內容。賦值就是借筆記的一個過程。
然後是淺拷貝copy()。我們繼續看一個例子:
>>> import copy
>>> n0 = [0,1,2,[30,31,[320,321]]]
>>> n2 = copy.copy(n0)
>>> n0[0] = 100
>>> n0[3 ][0] = 333333
>>> n0
[100, 1, 2, [333333, 31, [320, 321]]]
>>> n2
[0, 1, 2, [333333, 31, [320, 321]]]
從這個例子可以看出,淺拷貝就是複製淺層資訊(啥?這不等於沒說嗎!彆著急,接著看。)我們再來打個比方:還是上課,還是aa記了筆記,hh曠課了,這次hh把aa筆記的大綱抄了下來,如果需要檢視內容,再根據大綱查詢相關部分的筆記,如果aa修改了筆記大綱,那麼hh是知道的,因為他之前抄了大綱,但是如果aa修改了某一條大綱下的筆記內容,那麼hh就不知道了,他還是根據之前摘抄的大綱尋找對應的筆記,找到的也是修改過後的你筆記內容了。淺拷貝就是摘抄大綱的過程
最後是深拷貝deepcopy。我們接著來看一個例子:
>>> n0 = [0,1,2,[30,31,[320,321]]]
>>> n3 = copy.deepcopy(n0)
>>> n0[0] = 10000
>>> n0[3][2][0] = 666
>>> n0
[10000, 1, 2, [30, 31, [666, 321]]]
>>> n3
[0, 1, 2, [30, 31, [320, 321]]]
從上面的例子可以看出來,無論深拷貝前的物件怎麼變化,拷貝後的物件始終都是最初的模樣。我們繼續之前的比方,在經歷了之前的教訓,hh為了防止aa篡改筆記內容,hh將筆記所有內容全部摘抄了一遍,連標點符號都沒放過,這樣無論aa之後再怎麼修改筆記,hh都能知道。深拷貝就是摘抄筆記全部內容的過程。
現在我們來總結一下:賦值——知道哪裡有一份筆記;淺拷貝——知道哪裡有一份筆記並且摘抄了筆記的大綱;深拷貝——將筆記全部摘抄一遍。