標籤: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學習-列表深淺拷貝