1. 程式人生 > >理解一下python中的淺copy和深copy

理解一下python中的淺copy和深copy

學習 class 修改 資源 需要 code [0 str 變量

最近在學習過程中,了解了一下,淺copy和深copy,做個記錄。

所謂淺拷貝就是對引用的拷貝,所謂深拷貝就是對對象的資源的拷貝。

首先,對賦值操作我們要有以下認識:

  1. 賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址( 舊瓶裝舊酒 )。
  2. 修改不可變對象(strtuple)需要開辟新的空間
  3. 修改可變對象(list等)不需要開辟新的空間
  • 淺拷貝僅僅復制了容器中元素的地址
>>> user = [‘tom‘, [‘age‘, 20]]
>>> user_new = user.copy()
>>> user_new
[‘tom‘, [‘age‘, 20]]
>>> user[0] = ‘jack‘
>>> user[1][1] = 19
>>> user
[‘jack‘, [‘age‘, 19]]
>>> user_new
[‘tom‘, [‘age‘, 19]]

  這裏可以看出,未修改前,user和user_new中元素的地址都是相同的,不可變的 ‘tom‘ 和可變的list地址都一樣。

  說明淺拷貝知識將容器內的元素的地址復制了一份。這可以通過修改後,user_new中字符串沒改變,但是list元素隨著user相應改變得到驗證。

淺拷貝是在另一塊地址中創建一個新的變量或容器,但是容器內的元素的地址均是源對象的元素的地址的拷貝。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )

  • 深拷貝,完全拷貝了一個副本,容器內部元素地址都不一樣
>>> import copy
>>> user = [‘tom‘, [‘age‘, 20]]
>>> user_new = copy.deepcopy(user)
>>> user_new
[‘tom‘, [‘age‘, 20]]
>>> user[0] = ‘jack‘
>>> user[1][1] = 19
>>> user
[‘jack‘, [‘age‘, 19]]
>>> user_new
[‘tom‘, [‘age‘, 20]]

  這裏可以看出,深拷貝後,user和user_new的地址以及user和user_new中的元素地址均不同,這是完全拷貝的一個副本。

  修改user後,發現user_new沒有發生任何改變,因為user_new是一個完全的副本,元素地址與user均不同,user修改不影響user_new。

深拷貝是在另一塊地址中創建一個新的變量或容器,同時容器內的元素的地址也是新開辟的,僅僅是值相同而已,是完全的副本。也就是說( 新瓶裝新酒 )。

理解一下python中的淺copy和深copy