1. 程式人生 > >Python深淺拷貝詳解

Python深淺拷貝詳解

一、淺拷貝

淺拷貝,記住一點,淺拷貝不管多複雜,只copy第一層,看圖說話。
1、定義源列表list_s,列表list_c,並進行拷貝操作,檢視兩列表的值相等,如下圖所示。

Python深淺拷貝詳解
2、現在源列表list_s資料更改,增加數值list_s.append(3),list_s數值改變,而列表list_c的值不變,如下圖所示。
Python深淺拷貝詳解
3、現在list_c資料更改,增加數值list_c.append(4),list_c數值改變,而源列表list_s的數值保持不變,如下圖所示。
Python深淺拷貝詳解
由以上三步操作可以看出,源list_s裡面嵌套了[3,4]列表,對源list_s進行追加3,發現list_s數值改變,而list_c數值沒有改變,而對list_c追加4,發現list_s數值未改變,而list_c數值改變了,那麼對源list_s裡面的[3,4]進行改變,看list_s和list_c數值會發生怎樣的變化,繼續往下看。


4、修改源list_s裡面的[3,4]值,增加5,變成[3,4,5],發現源list_s改變,list_c數值也發生改變,而且,兩者更改的地方是一樣的,都變成了[3,4,5],如下圖所示。
Python深淺拷貝詳解
5、那麼修改list_c裡面的[3,4,5]值,增加6,變成[3,4,5,6],發現list_c改變,源list_s數值也發生改變,而且,兩者更改的地方是一樣的[3,4,5,6],如下圖所示。
Python深淺拷貝詳解
由以上兩步操作可以看出,不管是源list_s,還是list_c改變列表中巢狀的列表[3,4]的值時,源list_s和list_c都會發生改變,而且變化一樣。
從記憶體地址來看,如下圖所示。
Python深淺拷貝詳解

綠色的為追加的內容,可以看出,進行淺拷貝之後,列表中巢狀的列表[3,4]指向的內容以及地址,並未發生改變,所以,不論[3,4]發生什麼樣的改變,llist_s和list_c都會發生同樣的改變,而第一層的列表,list_s和list_c都是相互獨立的,兩者發生改變不會影響對方。

綜上所述,淺拷貝只拷貝第一層,深層次的資料改變都會影響其他。

二、深拷貝

搞明白淺拷貝之後,深拷貝就很好理解了,深拷貝就是在記憶體中重新開闢一塊空間,不管資料結構有多複雜,只要資料發生改變,就重新開闢一塊記憶體空間把內容複製下來,直到最後一層,通俗點講就是,深拷貝就是重新定義一個變數,於之前的沒有半毛錢關係,所以更改裡面的內容,原來的並不會發生改變。舉例說明,如下圖所示。
Python深淺拷貝詳解
定義list_s=[1,2,[3,4]],而list_c進行深拷貝,初始值,兩者一樣,然後對list_s追加3,對list_c中的列中中的列表[3,4]追加5,發現,list_s為[1,2,[3,4],3], list_c為[1,2,[3,4,5]]彼此的變化並沒有影響對方。

綜上所述,深拷貝是完全拷貝,資料變化隻影響自己本身。