單層淺拷貝 單層深拷貝 結論一: 不管深拷貝還是淺拷貝對 不可變數據類型 都是引用記憶體地址 不管深拷貝還是淺拷貝對 可變數據類型 都是會重新創建新的記憶體空間 淺拷貝嵌套 深拷貝嵌套 結論二: 淺拷貝: 1. 外層是不可變類型、不管內層是否可變都是引用拷貝 2. 外層是可變類型,不管內層是否可變都會從 ...
單層淺拷貝
import copy
a = 1 # 不可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體地址相同
a = [1,2] # 可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
單層深拷貝
import copy
a = 1 # 不可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體地址相同
a = [1,2] # 可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
結論一:
不管深拷貝還是淺拷貝對不可變數據類型都是引用記憶體地址
不管深拷貝還是淺拷貝對可變數據類型都是會重新創建新的記憶體空間
淺拷貝嵌套
# -----------不可變數據類型---------
# 情況一,內嵌可變數據類型
import copy
a = ([1,2],(3,4)) # 不可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體地址相同
# 情況二,內嵌不可變數據類型
a = ((1,2),(3,4)) # 不可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體地址相同
#-----------可變數據類型-------------
# 情況一,內嵌可變數據類型
import copy
a = [(1,2),[3,4]] # 可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
# 情況一, 可變數據類型 內嵌可變數據類型
import copy
a = [(1,2),(3,4)] # 可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
深拷貝嵌套
# -----------不可變數據類型---------
# 情況一,內嵌可變數據類型
import copy
a = ([1,2],(3,4)) # 不可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
# 情況二,內嵌不可變數據類型
a = ((1,2),(3,4)) # 不可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體地址相同
#-----------可變數據類型-------------
# 情況一,內嵌可變數據類型
import copy
a = [(1,2),[3,4]] # 可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
print(id(a[0]),id(copy_a[0])) # 記憶體地址相同
print(id(a[1]),id(copy_a[1])) # 記憶體地址不相同
# 情況一, 可變數據類型 內嵌可變數據類型
import copy
a = [(1,2),(3,4)] # 可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體地址不相同
print(id(a[0]),id(copy_a[0])) # 記憶體地址相同
結論二:
淺拷貝:
- 外層是不可變類型、不管內層是否可變都是引用拷貝
- 外層是可變類型,不管內層是否可變都會從新創建新的記憶體空間
深拷貝:
- 外層是不可變類型,會遞歸判斷內層數據類型、如果可變則創建新的記憶體地址、都為不可變就是引用拷貝
- 外層是可變數據類型、不管內層是否可變都會創新新的記憶體地址、但是內部如果為可變則遞歸創建、不可變則為引用地址
總結:
淺拷貝:
- 淺拷貝只做最頂層的數據類型判斷
- 如果頂層是可變類型則創建新的記憶體空間
- 如果頂層是不可變數據類型就是引用拷貝
深拷貝:
- 深拷貝做遞歸拷貝,可以遞歸拷貝所有的內部嵌套數據(可以理解為迴圈遍歷做淺拷貝判斷)
- 深拷貝遞歸拷貝遇到可變類型則創建新的記憶體空間
- 深拷貝遞歸拷貝遇到不可變數據類型就是拷貝的引用