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