python 深/淺複製及其區別

二月雪發表於2024-09-06

概述

1、什麼是淺複製?

淺複製是指建立一個新的資料結構物件,該物件是原始資料結構的副本,但不復制原始資料結構中的巢狀物件的引用。淺複製可以透過各種方式完成,如切片、工廠函式或copy模組的copy方法。

2、什麼是深複製?

深複製是指建立一個新的資料結構物件,該物件是原始資料結構及其所有巢狀物件的完整副本。深複製通常使用copy模組的deepcopy方法來完成。

3、區分淺複製和深複製

淺複製和深複製的區別在於它們是否複製了原始資料結構中的巢狀物件的引用。讓我們透過示例程式碼來演示這一區別。

淺複製示例:

import copy

# 建立一個原始列表
original_list = [1, [2, 3], [4, 5], 9]

# 淺複製
shallow_copy = copy.copy(original_list)
shallow_copy_2 = copy.copy(original_list)

# 修改淺複製的元素
shallow_copy[1][0] = 6

# 修改淺複製2的元素
shallow_copy_2[-1] = 10

# 輸出原始列表和淺複製
print("Original List:", original_list)
print("Shallow Copy:", shallow_copy)
print("Shallow Copy:", shallow_copy_2)

# 輸出結果:
# Original List: [1, [6, 3], [4, 5], 9]  # 可見原列表物件的 巢狀list 的數值跟著改變了,但非巢狀結構的值是不會改變的
# Shallow Copy: [1, [6, 3], [4, 5], 9]  # 對巢狀列表內的值 做了更改
# Shallow Copy: [1, [6, 3], [4, 5], 10]  # 對 非巢狀其他其結構 的值做了更改

結果顯示出淺複製只複製了原始資料結構的引用,而不復制巢狀物件的引用。這意味著修改淺複製會影響原始資料結構。

深複製示例:

import copy

# 建立一個原始列表
original_list = [1, [2, 3], [4, 5], 9]

# 深複製
deep_copy = copy.deepcopy(original_list)
deep_copy_2 = copy.deepcopy(original_list)

# 修改深複製的元素
deep_copy[2][0] = 7
# 修改深複製2的元素
deep_copy_2[-1] = 8

# 輸出原始列表和深複製
print("Original List:", original_list)

print("Deep Copy:", deep_copy)
print("Deep Copy:", deep_copy_2)

# 輸出結果(深複製的修改對原物件不會進行改動):
# Original List: [1, [2, 3], [4, 5], 9]
# Deep Copy: [1, [2, 3], [7, 5], 9]
# Deep Copy: [1, [2, 3], [4, 5], 8]

相關文章