Python 裏面 copy 和 deepcopy 的區別

deepcopy(深複製),即將被複制對象完全再複製一遍作爲獨立的新個體單獨存在。所以改變原有被複制對象不會對已經複製出來的新對象產生影響。

而等於(=)賦值,並不會產生一個獨立的對象單獨存在,他只是將原有的數據塊打上一個新標籤, 所以當其中一個標籤被改變的時候,數據塊就會發生變化,另一個標籤也會隨之改變。

而 copy(淺複製)要分兩種情況進行討論:

1)當淺複製的值是不可變對象(數值,字符串,元組)時和“等於賦值”的情況一樣,對象的 id 值與淺複製原來的值相同。

2)當淺複製的值是可變對象(列表和元組)時會產生一個“不是那麼獨立的對象”存在。有兩種情 況:

第一種情況:複製的 對象中無 複雜 子對象,原來值的改變並不會影響淺複製的值,同時淺複製的值改變也並不會影響原來的值。原來值的 id 值與淺複製原來的值不同。

第二種情況:複製的對象中有 複雜 子對象 (例如列表中的一個子元素是一個列表),如果不改變其中複雜子對象,淺複製的值改變並不會影響原來的值。但是改變原來的值 中的複雜子對象的值 會影響淺複製的值。

對於簡單的 object,例如不可變對象(數值,字符串,元組),用shallow copy 和 deep copy 沒區別。複雜的 object, 如 list 中套着 list 的情況,shallow copy 中的 子 list,並未從原 object 真的「獨立」出來。也就是說,如果你改變原 object 的子 list 中的一個元素,你的 copy 就會跟着一起變。這跟我們直覺上對「複製」的理解不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章