Python學習-列表深淺拷貝

來源:互聯網
上載者:User

標籤:png   str   分享   hal   ict   運行   圖片   深淺拷貝   改變   

一、先看一個簡單的指派陳述式
lst1 = [‘France‘, ‘Belgium‘, ‘England‘]lst2 = lst1# lst1.append(‘Uruguay‘)lst2.append(‘Uruguay‘)print(lst1, lst2)# 猜測一下lst1, lst2的結果;lst2變化是否對lst1產生影響,lst1變化是否對lst2產生影響

輸出結果:

[‘France‘, ‘Belgium‘, ‘England‘, ‘Uruguay‘] [‘France‘, ‘Belgium‘, ‘England‘, ‘Uruguay‘]

不知道你是否猜對了?是否對輸出結果感到疑惑?我們來看一下,在記憶體中變數與對象的對應關係,以及具體變化。

(圖畫的不是很好, Pages工具用的不是很熟, 請見諒)

由可知,改變lst1或lst2,lst1和lst2同時發生變化。

 

二、列表的淺拷貝

淺拷貝(copy): 拷貝父物件, 不會拷貝對象的內部的子物件.

1、程式碼範例1

# 淺拷貝movies = [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]movies_c = movies.copy()movies.append(‘解救吾先生‘)  # 直接改變movies列表print(‘movies:‘, movies)print(‘movies_c‘, movies_c)# 運行結果movies: [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘, ‘解救吾先生‘]movies_c [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]

2、程式碼範例2

# 淺拷貝movies = [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]movies_c = movies.copy()movies[2].append(‘教父‘)  # 改變列表內部嵌套的列表print(‘movies:‘, movies)print(‘movies_c‘, movies_c)# 運行結果movies: [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘, ‘教父‘], ‘無問西東‘]movies_c [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘, ‘教父‘], ‘無問西東‘]

結論:

  1) 由程式碼範例1和樣本2的結果可以看出, 直接改變列表(一級元素增刪改), 拷貝的列表不受影響;

  2) 當改變列表內部嵌套的列表的元素時, 拷貝的列表也受影響.

 

三、列表的深拷貝

深拷貝(deepcopy): copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。

1、程式碼範例3

# 深拷貝import copymovies = [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]movies_c = copy.deepcopy(movies)movies.append(‘萬箭穿心‘)print(‘movies:‘, movies)print(‘movies_c:‘, movies_c)運行結果:movies: [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘, ‘萬箭穿心‘]movies_c: [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]

2、程式碼範例4

# 深拷貝import copymovies = [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]movies_c = copy.deepcopy(movies)movies[2].append(‘這個殺手不太冷‘)print(‘movies:‘, movies)print(‘movies_c:‘, movies_c)運行結果:movies: [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘, ‘這個殺手不太冷‘], ‘無問西東‘]movies_c: [‘藥神‘, ‘邪不壓正‘, [‘美國往事‘, ‘辛德勒的名單‘], ‘無問西東‘]

結論: 不管是直接改變列表(一級元素增刪改), 還是改變列表內部嵌套的列表, 拷貝的列表不受影響.

 

深淺拷貝, 參考了菜鳥教程, 點擊跳轉. 拷貝前後, 變數與對象在記憶體中的對應關係, 可以參考教程中的圖文解釋.

Python學習-列表深淺拷貝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.