3、深淺拷貝

1. 整型、字符串和布爾類型的深淺拷貝

import copy
a = 'Aaron'
b = copy.copy(a)  # 淺拷貝
c = copy.deepcopy(a)  # 深拷貝

# 注意:對於簡單的不可變類型(int、str、bool),淺拷貝和深拷貝是同樣的。

2. 列表、集合和字典的深淺拷貝

import copy
a = [1, 2, [3, 4], 5]
b = copy.copy(a)  # 淺拷貝,只是將a的最外層地址拷貝一份。
c = copy.deepcopy(a)  # 深拷貝,將a的地址和它包含的全部可變類型的地址都拷貝一份(此處就拷貝了a的地址和其中元素[3, 4]的地址。

print(id(a), id(b), id(c))
print('==='*15)
print(id(a[1]), id(b[1]), id(c[1]))
print('==='*15)
print(id(a[2]), id(b[2]), id(c[2]))

# 輸出結果
66748936 66921096 66921160
=============================================
8790802010976 8790802010976 8790802010976
=============================================
66823752 66823752 66920840

3. 元組的深淺拷貝

import copy

print('元組元素包含可變類型:\n')
a1 = (1, 2, [3, 4], 5)
b1 = copy.copy(a1)  # 淺拷貝,和a原來的地址同樣,不進行拷貝。
c1 = copy.deepcopy(a1)  # 深拷貝,a的元素包含可變類型,將a的地址和它包含的全部可變類型的地址都拷貝一份(此處就拷貝了a的地址和其中元素[3, 4]的地址。

print(id(a1), id(b1), id(c1))
print('==='*15)
print(id(a1[1]), id(b1[1]), id(c1[1]))
print('==='*15)
print(id(a1[2]), id(b1[2]), id(c1[2]))

print('\n元組元素不包含可變類型:\n')
a2 = (1, 2, 3, 4, 5)
b2 = copy.copy(a2)  # 淺拷貝,和a原來的地址同樣,不進行拷貝。
c2 = copy.deepcopy(a2)  # 深拷貝,a的元素爲不可變類型,和a原來的地址同樣,不進行拷貝。

print(id(a2), id(b2), id(c2))
print('==='*15)
print(id(a2[1]), id(b2[1]), id(c2[1]))
print('==='*15)
print(id(a2[2]), id(b2[2]), id(c2[2]))


# 輸出結果
元組元素包含可變類型:

57627496 57627496 57981672
=============================================
8790802010976 8790802010976 8790802010976
=============================================
66627464 66627464 66724552

元組元素不包含可變類型:

57697824 57697824 57697824
=============================================
8790802010976 8790802010976 8790802010976
=============================================
8790802011008 8790802011008 8790802011008
相關文章
相關標籤/搜索