[Python] 深拷貝與淺拷貝:理解列表、字典等

Python提供了兩種創建物件副本的方法:深度複製和淺度複製。深度複製創建整個物件及其內部所有物件的全新獨立副本,而淺度複製則創建一個新物件,並引用原始物件的內容。這種區別可能會影響對一個物件的更改如何影響另一個物件。

在本博客文章中,我們將深入探討Python中的深度和淺度複製,使用諸如列表、字典、字串、整數等物件。我們將通過實用示例比較這兩種複製類型,強調理解這些概念對於穩健的編碼實踐的重要性。

深度複製

使用 copy 模組

Python提供了copy模組,其中包含deepcopy方法來創建物件的深度副本。

python
import copy

original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[1][0] = 'changed'
print(original_list)  # 輸出:[1, [2, 3], [4, 5]]

上述代碼片段展示了使用deepcopy方法創建深度副本的過程。deep_copied_list的更改不會影響original_list

淺度複製

使用 copy 方法

淺度副本可以使用copy模組中的copy方法或物件的內置複製功能創建。

python
import copy

original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = copy.copy(original_dict)
shallow_copied_dict['a'][0] = 'changed'
print(original_dict)  # 輸出:{'a': ['changed', 2], 'b': [3, 4]}

此代碼片段強調了對shallow_copied_dict的更改反映在original_dict中,因為淺度副本包含對原始物件內容的引用。

複製各種物件類型

在Python中,可對不同類型的物件(例如列表、字典、字串和整數)執行深度和淺度複製。這些複製方法在Mutable和Immutable類型之間的行為有所不同。下面是詳細解釋:

List

深度複製

python
import copy

original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)

淺度複製

python
original_list = [1, [2, 3], [4, 5]]
shallow_copied_list = original_list.copy()
shallow_copied_list[1][0] = 'changed'
print(original_list)  # 輸出:[1, ['changed', 3], [4, 5]]

對於列表,深度副本創建了完全獨立的副本,而淺度副本則導致嵌套物件的共享引用。

Dictionary

深度複製

python
import copy

original_dict = {'a': [1, 2], 'b': [3, 4]}
deep_copied_dict = copy.deepcopy(original_dict)

淺度複製

python
original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = original_dict.copy()
shallow_copied_dict['a'][0] = 'changed'
print(original_dict)  # 輸出:{'a': ['changed', 2], 'b': [3, 4]}

對於字典,深度複製創建全新的物件,而淺度複製則導致嵌套物件的引用。

String, Integer(Immutable類型)

深度複製

python
original_str = "text"
deep_copied_str

 = copy.deepcopy(original_str)
original_int = 42
deep_copied_int = copy.deepcopy(original_int)

淺度複製

python
original_str = "text"
shallow_copied_str = copy.copy(original_str)
original_int = 42
shallow_copied_int = copy.copy(original_int)

字串和整數是不可變的,這意味著深度和淺度複製的行為相同,創建全新的物件。

概要表

物件類型深度複製淺度複製Mutable / Immutable
List創建獨立副本對嵌套物件的共享引用Mutable
Dictionary創建獨立副本對嵌套物件的共享引用Mutable
String創建獨立副本創建獨立副本Immutable
Integer創建獨立副本創建獨立副本Immutable

了解不同類型物件的複製行為對於在Python中有效處理複雜數據結構至關重要。它提供了對物件如何複製和引用的控制,使代碼更加精確和高效。


理解深度和淺度複製之間的區別對於操作Python中的複雜數據結構至關重要。它允許對物件的複製和引用進行精確控制,使編碼實踐更加精簡和高效。


常見問答

  1. 深度複製和淺度複製之間的主要區別是什麼? 深度複製創建了一個全新的物件,而淺度複製則創建了一個引用原始物件內容的新物件。
  2. 我如何創建字典或列表的深度副本? 使用copy模組中的deepcopy方法創建深度副本。
  3. 淺度副本適合所有類型的物件嗎? 淺度副本與Mutable和Immutable物件的行為不同。理解這種行為在選擇複製方法時至關重要。
  4. 淺度副本的更改是否會影響原始物件? 是的,對像列表和字典這樣的Mutable物件的淺度副本進行的更改可能會影響原始物件。
  5. 使用淺度複製還是深度複製更有效率? 通常,淺度複製更有效率,因為它不會重新創建整個物件。然而,淺度和深度複製之間的選擇應取決於代碼的具體要求。
© Copyright 2023 CLONE CODING