deepcopy(深複製),即將被複制對象完全再複製一遍作爲獨立的新個體單獨存在。所以改變原有被複制對象不會對已經複製出來的新對象產生影響。
而等於(=)賦值,並不會產生一個獨立的對象單獨存在,他只是將原有的數據塊打上一個新標籤, 所以當其中一個標籤被改變的時候,數據塊就會發生變化,另一個標籤也會隨之改變。
而 copy(淺複製)要分兩種情況進行討論:
1)當淺複製的值是不可變對象(數值,字符串,元組)時和“等於賦值”的情況一樣,對象的 id 值與淺複製原來的值相同。
2)當淺複製的值是可變對象(列表和元組)時會產生一個“不是那麼獨立的對象”存在。有兩種情 況:
第一種情況:複製的 對象中無 複雜 子對象,原來值的改變並不會影響淺複製的值,同時淺複製的值改變也並不會影響原來的值。原來值的 id 值與淺複製原來的值不同。
第二種情況:複製的對象中有 複雜 子對象 (例如列表中的一個子元素是一個列表),如果不改變其中複雜子對象,淺複製的值改變並不會影響原來的值。但是改變原來的值 中的複雜子對象的值 會影響淺複製的值。
對於簡單的 object,例如不可變對象(數值,字符串,元組),用shallow copy 和 deep copy 沒區別。複雜的 object, 如 list 中套着 list 的情況,shallow copy 中的 子 list,並未從原 object 真的「獨立」出來。也就是說,如果你改變原 object 的子 list 中的一個元素,你的 copy 就會跟着一起變。這跟我們直覺上對「複製」的理解不同。