python的深拷貝與淺拷貝

2021-09-26 21:52:27 字數 2078 閱讀 2676

首先來說淺拷貝, 是指拷貝了引用, 但是並沒有拷貝內容。

>>> a = [1, 2, 3, 4]

>>> b = a

>>> id(a)

139876864002248

>>> id(b)

139876864002248

可以看到, 再給b 賦值為 a 的值時, 並不是為b單獨分了一塊記憶體,然後將內容拷貝進去,

而是將b 指向了a 所在的位址, 這就是淺拷貝。

ok, 那麼推理而來, 深拷貝就應當是 為變數分配一塊記憶體, 然後將數值拷貝進去,

而不僅僅是只拷貝乙個引用。

首先我們先來看深拷貝如何實現:

可以看到, 我們需要引入乙個 copy模組, 然後使用copy.deepcopy的方法來實現深拷貝。

結果也就是像下面表述的那樣, 不再是給c 乙個 a 的引用了 ,分配記憶體,然後賦具體值。

下面我們再從側面來驗證一下, 

# 這裡,b是淺拷貝,c是深拷貝

import copy

a = [1, 2, 3, 4]

b = a

c = copy.deepcopy(a)

# 接下來我們改變 a 的值, 並輸出a,b,c三個結果

---------- output --------

a is [1, 2, 3, 4, 5]

b is [1, 2, 3, 4, 5]

c is [1, 2, 3, 4]

可以看到, 在a 發生改變後, 由於b 指向的記憶體也是 a , 所以b的值也會隨之改變。

但是 c 是拷貝了 a 之前的全部內容,這裡在a 發生改變之後,並不會影響到 c 。

如果我們有變數 c , 且 c = [a , b]  ,那麼 c 是深拷貝還是淺拷貝呢?

——當然, 根據我們上面所描述的,這裡的c是屬於淺拷貝, 也就是他的這片記憶體裡不是確切的值,

而是關於 a 和 b 這兩個變數的引用。

如果我們再執行 d=c ,還是淺拷貝無疑

但是如果我是這樣定義的, 

e = copy.deepcopy(c)
那麼這可就不是淺拷貝了, 我們可以從下圖中驗證到這一點

好了, 那麼我們思考一下, 這個 e 中到底存的是什麼呢?

按照我們上面所說的, 深拷貝這種操作拷貝的是c 中的具體內容, 但是 c中的具體內容就是乙個關於 a 和 b 的引用,

那麼是不是將這些個引用拷貝進來???    還是為e 分配一塊記憶體,然後賦值???

這兩種情況的表述如下:

ok , 我們來驗證一下, 如果e 是拷貝的c 中的引用, 那麼如果我們修改 a ,c 也會發生變化, 進而會影響到e ; 

但是如果不是拷貝的引用, 那麼 a 的修改會影響到c ,但是卻不會影響到 e 。

可以看到, 我們的e 不發生變化, 也就是第二種說法才是對的。

即, 在執行深拷貝的時候, 如果發現要拷貝的是乙個引用, 那麼程式會繼續向上挖掘, 知道拷貝到內容為止;

ps: 這可能也就是深拷貝之所以叫做深拷貝的原因所在了吧 ?

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 對乙個全部是不可變型...