Python - 複製列表
大家好,有志於成為Python程序設計師的你!今天,我們將深入探討在Python中複製列表的奇妙世界。作為你親切友善的電腦科學老師,我將引導你透過清晰的解釋、大量的範例,甚至可能還會在途中穿插一兩個笑話。那麼,讓我們開始吧!
在Python中複製列表
在我們深入了解複製列表的不同方法之前,讓我們先了解為什麼我們需要複製列表。想像一下,如果你有一個購物清單,你想與你的室友分享。你可以給他們你的原始清單,但如果他們決定在清單中加入"巧克力"(誰不會呢)?突然間,你精心規劃的健康購物清單就被破壞了!這就是複製的用處所在。
在Python中,當你將一個列表賦值給一個新變量時,你並不是在創建一個新的列表。相反,你是在創建一個對同一個列表的新參考。讓我們看看這是怎麼工作的:
original_list = [1, 2, 3, 4, 5]
new_list = original_list
print("原始列表:", original_list)
print("新列表:", new_list)
new_list.append(6)
print("修改後的原始列表:", original_list)
print("修改後的新列表:", new_list)
輸出:
原始列表: [1, 2, 3, 4, 5]
新列表: [1, 2, 3, 4, 5]
修改後的原始列表: [1, 2, 3, 4, 5, 6]
修改後的新列表: [1, 2, 3, 4, 5, 6]
驚訝嗎?兩個列表都改變了,因為它們實際上是記憶體中的同一個列表。這就是複製來拯救的地方!
在Python列表上使用淺複製
淺複製會創建一個新的列表物件,但新列表中的元素是對原始列表中同一個物件的參考。這就像是你對購物清單進行影印——你有一張新的紙,但上面寫的項目是相同的。
讓我們看看如何創建淺複製:
import copy
original_list = [1, [2, 3], 4]
shallow_copy = copy.copy(original_list)
print("原始列表:", original_list)
print("淺複製:", shallow_copy)
shallow_copy[1][0] = '二'
print("修改後的原始列表:", original_list)
print("修改後的淺複製:", shallow_copy)
輸出:
原始列表: [1, [2, 3], 4]
淺複製: [1, [2, 3], 4]
修改後的原始列表: [1, ['二', 3], 4]
修改後的淺複製: [1, ['二', 3], 4]
注意到改變淺複製中的嵌套列表也影響了原始列表嗎?那是因為嵌套列表仍然是對記憶體中同一個物件的參考。
在Python列表上使用深複製
另一方面,深複製會創建一個新的列表,並遞歸地添加嵌套物件的複製。這就像是你重新手寫整個購物清單——一切都是全新的和獨立的。
以下是創建深複製的方法:
import copy
original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)
print("原始列表:", original_list)
print("深複製:", deep_copy)
deep_copy[1][0] = '二'
print("修改後的原始列表:", original_list)
print("修改後的深複製:", deep_copy)
輸出:
原始列表: [1, [2, 3], 4]
深複製: [1, [2, 3], 4]
修改後的原始列表: [1, [2, 3], 4]
修改後的深複製: [1, ['二', 3], 4]
這次,修改深複製並沒有影響原始列表。它是完全獨立的!
使用切片表示法複製列表
現在,讓我們看看複製列表的其他方法。一種最簡單的方法是使用切片表示法。這就像是在說:"我想要從頭到尾的整個列表的複製。"
original_list = [1, 2, 3, 4, 5]
slice_copy = original_list[:]
print("原始列表:", original_list)
print("切片複製:", slice_copy)
slice_copy.append(6)
print("修改後的原始列表:", original_list)
print("修改後的切片複製:", slice_copy)
輸出:
原始列表: [1, 2, 3, 4, 5]
切片複製: [1, 2, 3, 4, 5]
修改後的原始列表: [1, 2, 3, 4, 5]
修改後的切片複製: [1, 2, 3, 4, 5, 6]
這種方法會創建列表的淺複製,對於像數字和字符串這樣的不可變物件列表通常已經足夠。
使用list()函數複製列表
另一種創建複製的方法是使用list()
函數。這就像告訴Python:"讓我有一個看起來和這個一樣的新列表。"
original_list = [1, 2, 3, 4, 5]
list_copy = list(original_list)
print("原始列表:", original_list)
print("列表複製:", list_copy)
list_copy.append(6)
print("修改後的原始列表:", original_list)
print("修改後的列表複製:", list_copy)
輸出:
原始列表: [1, 2, 3, 4, 5]
列表複製: [1, 2, 3, 4, 5]
修改後的原始列表: [1, 2, 3, 4, 5]
修改後的列表複製: [1, 2, 3, 4, 5, 6]
這種方法也會創建列表的淺複製。
使用copy()函數複製列表
最後但並非最不重要,我們有copy()
方法,這是列表的內建方法。這就像列表在說:"這裡,給你一個我的複製!"
original_list = [1, 2, 3, 4, 5]
copy_method = original_list.copy()
print("原始列表:", original_list)
print("複製方法:", copy_method)
copy_method.append(6)
print("修改後的原始列表:", original_list)
print("修改後的複製方法:", copy_method)
輸出:
原始列表: [1, 2, 3, 4, 5]
複製方法: [1, 2, 3, 4, 5]
修改後的原始列表: [1, 2, 3, 4, 5]
修改後的複製方法: [1, 2, 3, 4, 5, 6]
這種方法也會創建列表的淺複製。
現在,讓我們以實用表格的形式總結所有這些方法:
方法 | 語法 | 複製類型 | 備註 |
---|---|---|---|
賦值 | new_list = original_list |
參考 | 不是真正的複製 |
淺複製 | copy.copy(original_list) |
淺 | 新列表,相同的物件參考 |
深複製 | copy.deepcopy(original_list) |
深 | 新列表,新的物件參考 |
切片表示法 | original_list[:] |
淺 | 容易閱讀 |
list()函數 | list(original_list) |
淺 | 目的明確 |
copy()方法 | original_list.copy() |
淺 | 列表的內建方法 |
請記住,選擇正確的複製方法取決於你的具體需求。如果你正在處理包含不可變物件的簡單列表,淺複製通常已經足夠。但是如果你有嵌套列表或可變物件,你可能需要深複製來確保完全獨立。
以上就是了!你现在已經掌握了像專家一樣複製列表的知識。下次你需要分享你的購物清單時,你將知道如何正確地複製一份,而不會有意外添加的風險。開心編程,願你的清單永遠完美複製!
Credits: Image by storyset