python賦值、淺拷貝和深拷貝的區別


一、python的三種賦值方式

  1. 直接賦值
  2. 淺拷貝(copy)
  3. 深拷貝(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函數的時候,也都是淺拷貝,因為淺拷貝有以下優點:
  1. 時間角度:淺拷貝花費時間更少;
  2. 空間角度:淺拷貝花費內存更少;
  3. 效率角度:淺拷貝只拷貝頂層數據,一般情況下比深拷貝效率高。

博主開通了微信公眾號 “python做些事” 會定期更新python和AI知識,希望大家可以喜歡

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM