首先來說淺拷貝, 是指拷貝了引用, 但是並沒有拷貝內容。
>>> 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 對乙個全部是不可變型...