Python列表深淺複製詳解

2022-02-08 07:28:16 字數 2096 閱讀 8148

**:

在文章《python 資料型別》裡邊介紹了列表的用法,其中列表有個 copy() 方法,意思是複製乙個相同的列表。例如

1 names = ["小明", "小紅", "小黑", "小黃", "小白"]

2 #把 names 複製,賦值給 names2 變數

3 names2 =names.copy()

4 #分別輸出 names names2

5 print(names)

6 print(names2)

這時會發現結果是一樣的,那麼問題來了,我要把 names 列表中的 小黃改成英文 yellow,那麼 names2 的小黃會發生變化嗎?寫一段**看看

1 names = ["小明", "小紅", "小黑", "小黃", "小白"]

2 #把 names 複製,賦值給 names 變數

3 names2 =names.copy()

4 #修改 names 列表中的 小黃

5 names[3] = "yellow"

6 #分別輸出 names names2

7 print(names)

8 print(names2)

看結果會發現,只是把names 列表中的 小黃 改成了 yellow ,names2 列表中沒有變,其實它的原理很簡單,如下圖

首先,names 指向乙個列表,然後把 names 複製了乙份,賦值給 names2 ,由於 修改的是 第乙個 列表的 小黃,所以第二個列表不受影響。

那麼現在我改一下這個列表,從names列表中再新增乙個列表,如下**

1 names = ["小明", "小紅", ["張三", "李四", "王五"], "小黑", "小黃", "小白"]

2 #複製乙份列表

3 names2 =names.copy()

4 #把李四 改成英文

5 names[2][1] = "lisi"

6 print(names) 7 print(names2)

這段**的執行結果是,兩個列表的李四都變成了英文,來分析一下原理

其實這個圖也挺簡單的,就是中間那個列表是單獨分配了一塊空間,然後從第一層列表中去引用位址,複製的names2 也是引用的位址,所以真實的值一變,兩個列表的內部列表的值也就變了。

也就是說 list.copy() 方法只能 copy 一層,這就是所謂的淺複製。

補充:第二個列表copy 第乙個列表,實際上第二個列表的每個元素是第乙個列表每個元素的引用

實現淺複製的三種方法

1 importcopy

2 3 names = ["小明", "小紅", "小黑", "小黃", "小白"]

4 #淺copy 1.

5 names1 =copy.copy(names)

6 #2.

7 names2 =names[:]

8 #3. 工廠函式

9 names3 = list(names)

深複製的方法

1 importcopy

2 3 names = ["小明", "小紅", "小黑", ["粉色"], "小黃", "小白"]

4 #深複製

5 deep_names =copy.deepcopy(names)

6 #修改粉色為 pink

7 names[3][0] = "pink"

8 #分別列印輸出兩個列表

9 print(names)

10 print(deep_names)

輸出結果為:['小明', '小紅', '小黑', ['pink'], '小黃', '小白'] ['小明', '小紅', '小黑', ['粉色'], '小黃', '小白']

Python 列表深淺複製詳解

列表有個 copy 方法,意思是複製乙個相同的列表 實現淺複製的方法 import copy names 小明 小紅 小黑 小黃 小白 names1 copy.copy names names2 names names3 list names 深複製的方法 import copy names 小明 ...

Python 深淺複製

python中的賦值語句不複製物件,它們在目標和物件之間建立繫結。對於可變的或包含可變項的容器,有時需要乙個副本,所以可以改變乙個副本而不改變另乙個。將建立乙個新物件,但它包含的是對原始物件包含的項的引用。a b list a c a.copy d copy.copy a 建立乙個新物件,並且遞迴的...

python深淺複製 Python中的深淺拷貝

1.什麼是深淺拷貝?python中一切皆物件,python中的數字 字串 元組等,如果存放在了記憶體中,這部分記憶體裡面的內容是不會改變的,但是也有情況,記憶體中存放了可變物件,比如說列表和字典,他們的記憶體空間是可以被修改的。下面我們定義乙個列表 list 1,2,3,4,5 list1 list...