如何在 Python 中複製清單(淺複製與深複製)

了解如何在 Python 中複製清單。探索列表切片、copy() 方法、列表建構函數,並掌握淺拷貝和深拷貝之間的差異。

在編輯器中嘗試此解決方案

概述

在Python中,列表是可變對象,變數在記憶體中保存對這些對象的引用而不是實際值。這意味著,如果您將清單指派給新變數(例如“list_b = list_a”),則兩個變數都引用完全相同的清單。透過「list_b」進行的任何修改都會立即影響「list_a」。為了避免這種副作用,您必須建立該清單的明確副本。

Python 提供了幾種建立清單淺表副本的方法。淺拷貝建構一個新列表,其中包含對原始列表中找到的元素的引用。常見的方法包括使用內建清單 `.copy()` 方法、使用清單切片 `list_a[:]` 或將清單傳遞給 `list()` 建構子。所有這些都會建立一個新的清單容器,讓您可以獨立地附加或刪除元素。

但是,如果清單包含嵌套的可變物件(例如清單或字典),則淺拷貝只會複製外部容器;嵌套物件保持共用。修改副本中的巢狀清單將變更原始清單。為了防止這種情況,您必須使用“copy”模組的“deepcopy()”函數執行深度複製,該函數會遞歸地複製層次結構內的每個物件。

程式碼和執行輸出

此程式碼演示了引用分配陷阱、使用 list.copy() 的淺複製以及使用 copy 模組的深複製嵌套列表。

import copy

# 1. The assignment reference trap (Not a copy!)
original = [1, 2, 3]
reference = original
reference.append(99)
print("Reference modification affects original:", original)

# Reset list
original = [1, 2, 3]

# 2. Creating a shallow copy (using list.copy())
shallow_copy = original.copy()
shallow_copy.append(100)
print("\nOriginal:", original)
print("Shallow copy:", shallow_copy)

# 3. The nested list limitation of shallow copies
nested = [[1, 2], [3, 4]]
shallow_nested = nested.copy()
shallow_nested[0].append(99) # Modifying nested list
print("\nOriginal nested:", nested)
print("Shallow nested copy:", shallow_nested)

# 4. Creating a deep copy
nested_original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_original)
deep_copy[0].append(99)
print("\nOriginal nested:", nested_original)
print("Deep copy (completely independent):", deep_copy)
端子輸出
Reference modification affects original: [1, 2, 3, 99]

Original: [1, 2, 3]
Shallow copy: [1, 2, 3, 100]

Original nested: [[1, 2, 99], [3, 4]]
Shallow nested copy: [[1, 2, 99], [3, 4]]

Original nested: [[1, 2], [3, 4]]
Deep copy (completely independent): [[1, 2, 99], [3, 4]]

逐步實施

  • 使用 my_list.copy() 或 my_list[:] 建立平面清單結構的淺表副本。
  • 當您需要獨立集合時,請避免像 copy_list = my_list 這樣的引用分配。
  • 匯入 copy 模組並對包含嵌套可變結構的清單使用 copy.deepcopy(my_list) 。
  • 確保您了解資料結構以優化效能和記憶體佔用。

常見問題解答

淺拷貝和深拷貝有什麼差別?

淺拷貝複製最外層的容器,但引用嵌套的可變物件。深拷貝遞歸地複製所有嵌套的容器和對象,從而產生完全隔離的資料結構。

列表切片 (list[:]) 比 list.copy() 更快嗎?

它們的性能幾乎相同,因為兩者都在底層執行最佳化的 C 操作。為了提高可讀性,通常首選使用 list.copy()。

相關主題

推薦的 Python 資源

透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。