一、python的三種賦值方式
- 直接賦值
- 淺拷貝(copy)
- 深拷貝(deepcopy)
直接賦值
直接賦值,就是對象的引用。(相當於給原來的對象起個別名),比如有個人叫李大壯,外號叫小李,對象的引用就是類似,雖然換個名字,但是兩個名字指的是同一個人。
接下來用代碼直觀的解釋
a=[1,2,[3,4],5]
b=a
print(b)
# 輸出結果為 [1,2,[3,4],5]

淺拷貝
淺拷貝,拷貝的是父對象,不會拷貝到內部的子對象。(單從一個淺字就可以看出他拷貝的東西不深,可以理解為只拷貝一層)
import copy
a=[1,2,[3,4],5]
b=copy.copy(a)
print(b)
# 結果為 [1,2,[3,4],5]
# 接下來我們更改a的數據
a.append(6)
print(a)
print(b)
# 結果為 [1,2,[3,4],5,6]和[1,2,[3,4],5]
# 可以發現淺層的數據更改(第一層)並沒有讓b發生變化
# 接下來進行子對象數據(深層數據)的更改
a[2].append(7)
print(a)
print(b)
# 結果為 [1,2,[3,4,7],5,6]和[1,2,[3,4,7],5]
# 可以發現b發生了改變

深拷貝
深拷貝,包含對象里面的自對象的拷貝(可以理解為克隆,全拷貝過去但是兩者沒有任何關系了,各玩各的),所以原始對象的改變不會造成深拷貝里任何子元素的改變
import copy
a=[1,2,[3,4],5]
b=copy.deepcopy(a)
print(b)
# 結果為 [1,2,[3,4],5]
# 接下來我們更改a的數據
a.append(6)
print(a)
print(b)
# 結果為 [1,2,[3,4],5,6]和[1,2,[3,4],5]
# 可以發現淺層的數據更改(第一層)並沒有讓b發生變化
# 接下來進行子對象數據(深層數據)的更改
a[2].append(7)
print(a)
print(b)
# 結果為 [1,2,[3,4,7],5,6]和[1,2,[3,4],5]

總結
根據上面的三個圖可以看出,其實深拷貝和淺拷貝都是對象存儲的內存地址發生了一定的變化。我們在使用copy函數的時候,也都是淺拷貝,因為淺拷貝有以下優點:
- 時間角度:淺拷貝花費時間更少;
- 空間角度:淺拷貝花費內存更少;
- 效率角度:淺拷貝只拷貝頂層數據,一般情況下比深拷貝效率高。
博主開通了微信公眾號 “python做些事” 會定期更新python和AI知識,希望大家可以喜歡

參考博客:
https://blog.csdn.net/bufengzj/article/details/90486991
