Python深淺拷貝詳解

1、淺拷貝

淺拷貝,記住一點,淺拷貝無論多複雜,只copy第一層,看圖說話。
一、定義源列表list_s,列表list_c,並進行拷貝操做,查看兩列表的值相等,以下圖所示。數據結構

Python深淺拷貝詳解
二、如今源列表list_s數據更改,增長數值list_s.append(3),list_s數值改變,而列表list_c的值不變,以下圖所示。
Python深淺拷貝詳解
三、如今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數值會發生怎樣的變化,繼續往下看。
四、修改源list_s裏面的[3,4]值,增長5,變成[3,4,5],發現源list_s改變,list_c數值也發生改變,並且,二者更改的地方是同樣的,都變成了[3,4,5],以下圖所示。
Python深淺拷貝詳解
五、那麼修改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深淺拷貝詳解app

綠色的爲追加的內容,能夠看出,進行淺拷貝以後,列表中嵌套的列表[3,4]指向的內容以及地址,並未發生改變,因此,不論[3,4]發生什麼樣的改變,llist_s和list_c都會發生一樣的改變,而第一層的列表,list_s和list_c都是相互獨立的,二者發生改變不會影響對方。ide

綜上所述,淺拷貝只拷貝第一層,深層次的數據改變都會影響其餘.

2、深拷貝

搞明白淺拷貝以後,深拷貝就很好理解了,深拷貝就是在內存中從新開闢一塊空間,無論數據結構有多複雜,只要數據發生改變,就從新開闢一塊內存空間把內容複製下來,直到最後一層,通俗點講就是,深拷貝就是從新定義一個變量,於以前的沒有半毛錢關係,因此更改裏面的內容,原來的並不會發生改變。舉例說明,以下圖所示。
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]]彼此的變化並無影響對方。3d

綜上所述,深拷貝是徹底拷貝,數據變化隻影響本身自己。

相關文章
相關標籤/搜索