Python深拷貝和淺拷貝解讀

2022-07-01 13:03:14 字數 2471 閱讀 3584

首先在之前的基礎學習中並沒有接觸到深拷貝和淺拷貝的知識,但是隨著我的不斷深入學習,發現了很多的更細的知識點需要補充。

在了解深拷貝和淺拷貝之前有必要來提及一下物件的比較,也就是'=='和'is'的判斷。

is和==做為判斷條件,我們經常使用,比如

if a == b || a is b:

pass

在之前未了解深拷貝和淺拷貝時,對於我的理解就是判斷2個物件的值相等。但是實際內部的判斷並非如此。

因為它們的值是相等的,所以判斷均為true,但是這並不能說明所有的現象,看下面例子

這裡的is判斷出現了f,是不是和之前的結果不一致呢?事實上,出於對效能優化的考慮,python 內部會對 -5 到 256 的整型維持乙個陣列,起到乙個快取的作用。這樣,每次你試圖建立乙個 -5 到 256 範圍內的整型數字時,python 都會從這個陣列中返回相對應的引用,而不是重新開闢一塊新的記憶體空間,但是如果超過這個區間,python就會重新分配新的記憶體位址。

看到這裡我們應該了解了is和 == 的區別,==是像我之前理解的一致,判斷值是否相等。is則是判斷id。

c = a: 賦值引用,a 和 c 都指向同乙個物件,記憶體位址相同。

個人理解:只要a的值發生變化,c一定跟著a發生變化。

b = copy.copy(a): 淺拷貝, a 和 b 是乙個獨立的物件(記憶體位址不同),但他們的子物件還是指向統一物件(是引用)。

個人理解:如果a的某個子物件是可變物件那麼這個子物件發生變化時,b也會發跟著發生變化,如果a的某個子物件是不可變物件,那麼這個不可變子物件發生改變不會影響到b

b = copy.deepcopy(a): 深度拷貝, a 和 b 完全拷貝了父物件及其子物件,兩者是完全獨立的。

個人理解:無論a的值怎麼變化始終不會影響到b

python 深拷貝 Python深拷貝和淺拷貝!

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值 b alist,預設淺拷貝傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變...

Python 深拷貝和淺拷貝

淺拷貝只拷貝了引用,並沒有拷貝內容,相當於把原來的引用複製了乙份給新的變數 深拷貝是將原來的值複製了乙份到新的地方 in 30 a 1,2,3 in 31 b a in 32 id a out 32 140618626865352 in 33 id b out 33 140618626865352 ...

python深拷貝和淺拷貝

copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件。比深拷貝更加節省記憶體 copy.deepcopy 深拷貝 拷貝物件及其子物件 用乙個簡單的例子說明如下 import copy公升 a 1,2,3,4,a b c b a c copy.copy a d copy.deepcop...