Python - 複製列表

大家好,有志於成為Python程序設計師的你!今天,我們將深入探討在Python中複製列表的奇妙世界。作為你親切友善的電腦科學老師,我將引導你透過清晰的解釋、大量的範例,甚至可能還會在途中穿插一兩個笑話。那麼,讓我們開始吧!

Python - Copy Lists

在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