25. 深淺複製

星光映梦發表於2024-10-30

一、什麼是淺複製

  只對物件的最頂層進行的複製稱為 淺複製。我們可以用 copy 模組中的 copy() 方法實現淺複製。

淺複製

import copy

a = [11, 22, 33]
b = [44, 55, 66]
c = [a, b]
d = copy.copy(c)

print(f"c: {c}")
print(f"d: {d}")
print(f"c == d: {c == d}")

print(f"id(c): {id(c)}")
print(f"id(d): {id(d)}")
print(f"c is d: {c is d}")

print(f"id(c[0]): {id(c[0])}")
print(f"id(d[0]): {id(d[0])}")

c[0][0] = 10
print(c)
print(d)

  當使用 copy.copy() 來完成淺複製的時候,它其實是需要檢查以下複製的資料是否是可變。如果是可變型別,則複製最頂層。如果是不可變型別,則複製其引用。

import copy

a = [11, 22, 33]
b = (11, 22, 33)

c = copy.copy(a)
d = copy.copy(b)

print(id(a), id(c))
print(id(b), id(d))

二、什麼是深複製

  對一個物件的所有層次的複製(遞迴複製)稱為 深複製。我們可以使用 copy 模組中的 deepcopy() 方法實現深複製。

深複製

import copy

a = [11, 22, 33]
b = [33, 44, 55]
c = [a, b]
d = copy.deepcopy(c)

print(f"c: {c}")
print(f"d: {d}")
print(f"c == d: {c == d}")

print(f"id(c): {id(c)}")
print(f"id(d): {id(d)}")
print(f"c is d: {c is d}")

print(f"id(c[0]): {id(c[0])}")
print(f"id(d[0]): {id(d[0])}")

c[0][0] = 10
print(c)
print(d)

二、其它的複製方式

【1】、序列切片

  當使用序列切片複製的時候是 淺複製

a = [11, 22, 33]
b = [33, 44, 55]
c = [a, b]
d = c[:]

print(f"c: {c}")
print(f"d: {d}")
print(f"c == d: {c == d}")

print(f"id(c): {id(c)}")
print(f"id(d): {id(d)}")
print(f"c is d: {c is d}")

print(f"id(c[0]): {id(c[0])}")
print(f"id(d[0]): {id(d[0])}")

c[0][0] = 10
print(c)
print(d)

【2】、字典的 copy() 方法

  字典的 copy() 方法也是 淺複製

p1 = dict(name="Sakura", age=10, pet_phrase=["絕對沒問題", "封印解除"])
p2 = p1.copy()

print(f"p1: {p1}")
print(f"p2: {p2}")
print(f"p1 == p2: {p1 == p2}")

print(f"id(p1): {id(p1)}")
print(f"id(p2): {id(p2)}")
print(f"p1 is p2: {p1 is p2}")

print(f"id(p1['pet_phrase']): {id(p1['pet_phrase'])}")
print(f"id(p2['pet_phrase']): {id(p2['pet_phrase'])}")

p1["pet_phrase"].append("變回你原來的樣子")
print(f"p1: {p1}")
print(f"p2: {p2}")

相關文章