PYTHON深拷貝與淺拷貝

2022-08-22 09:42:08 字數 2197 閱讀 4269

淺拷貝就是對引用的拷貝,深拷貝就是對物件的資源的拷貝

淺拷貝僅僅複製了容器中元素的位址

賦值的原則

1.賦值是將乙個物件的位址賦值給乙個變數,讓變數指向該位址( 舊瓶裝舊酒 )。

2.修改不可變物件(str、tuple)需要開闢新的空間

3.修改可變物件(list等)不需要開闢新的空間

#用切片的方式拷貝

未修改前,a和b中元素的位址都是相同的,不可變的hello和可變的list位址都一樣,說明淺拷貝是將容器內的元素的位址複製了乙份。這可以通過修改後,b中字串沒改變,但是list元素隨著a相應改變得到驗證。

>>> a=['hello',[1,2,3]]

>>> b=a[:]

>>> [id(x) for x in a]

[42730136, 42709064]

>>> [id(x) for x in b]

[42730136, 42709064]

>>> a[0]='world'

>>> print(a)

['world', [1, 2, 3, 4]]

>>> print(b)

['hello', [1, 2, 3, 4]]

#直接用『=』拷貝

>>> c=a								

>>> [id(x) for x in a]

[42730136, 42709064]

>>> [id(x) for x in c]

[42730136, 42709064]

>>> a[0]='world'

>>> print(a)

['world', [1, 2, 3, 4]]

>>> print(c)

['world', [1, 2, 3, 4]]

淺拷貝是在另一塊位址中建立乙個新的變數或容器,但是容器內的元素的位址均是源物件的元素的位址的拷貝。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )。

完全拷貝了乙個副本,容器內部元素位址都不一樣

深拷貝後,a和b的位址以及a和b中的元素位址均不同,這是完全拷貝的乙個副本,修改a後,發現b沒有發生任何改變,因為b是乙個完全的副本,元素位址與a均不同,a修改不影響b。

>>> from copy import deepcopy

>>> a=['hello',[1,2,3]]

>>> b=deepcopy(a)

>>> [id(x) for x in a]

[42730304, 43122056]

>>> [id(x) for x in b]

[42730304, 43250696]

>>> a[0]='world'

>>> print(a)

['world', [1, 2, 3, 4]]

>>> print(b)

['hello', [1, 2, 3]]

>>> [id(x) for x in a]

[42730248, 43122056]

>>> [id(x) for x in b]

[42730304, 43250696]

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

擴充套件copy()與deepcopy()區別

>>> from copy import deepcopy

>>> a=['hello',[1,2,3]]

>>> b=deepcopy(a)

>>> [id(x) for x in a]

[42730304, 43122056]

>>> [id(x) for x in b]

[42730304, 43250696]

>>> a[0]='world'

>>> print(a)

['world', [1, 2, 3, 4]]

>>> print(b)

['hello', [1, 2, 3]]

>>> [id(x) for x in a]

[42730248, 43122056]

>>> [id(x) for x in b]

[42730304, 43250696]

綜上,copy為淺拷貝,而deepcopy為深拷貝

Python 淺拷貝與深拷貝

淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...

Python 淺拷貝與深拷貝

以下例項是使用 copy 模組的 copy.copy 淺拷貝 和 copy.deepcopy usr bin python coding utf 8 import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物件的引用 c copy.copy a 物件拷貝,淺拷貝 d copy....

python 深拷貝與淺拷貝

當乙個變數 的時候,約定為 指向位址的過程 如果copy.copy 拷貝的是元組,那麼它不會進行淺拷貝,僅僅是指向 因為元組是不可變資料型別,那麼意味著資料一定不能修改,因此用copy.copy的 時候它會自動判斷,是指向。如果,用copy.copy copy.deepcopy 對乙個全部是不可變型...