python中的直接賦值和深淺拷貝解析

2021-09-24 21:51:45 字數 1513 閱讀 3766

在python中直接賦值其實只是將引用位址之間的傳遞。

如圖所示,這是python中原子型別的賦值結果,當你修改變數1的時候,變數2的值並不會隨著改變。接下來看一下容器型別[list, dict, set…]的賦值情況,我以列表型別舉例:

為什麼修改了list1之後,list2的內容也會改變?

首先他和原子型別的區別在於原子型別是不可變的,所以你只能通過改變引用物件,指向的記憶體位址也就相應改變了,而列表本身是可變的,所以你可以直接對其進行修改,但是你的修改並不會改變這個列表的記憶體位址,只不過是可能修改了內部元素的所指向的記憶體位址,而列表本身會對其內部的元素進行乙個維護。

那麼如果我們想要乙份同樣的資料,但是是不同的物件該怎麼辦?可以呼叫物件的copy()方法或者匯入copy模組,呼叫copy.copy()來生成原物件的乙份淺拷貝。

根據截圖看到如果對列表進行元素的新增是支援的,但是子元素的記憶體位址是固定的,所以推測對於原子型別修改沒問題,但是對於容器型別的修改也會出現牽一髮而動全身的問題。

根據截圖來看,確實符合之前的推斷只要他記得是容器的位址,那麼就會出現相互影響,如果想要徹徹底底沒有關係,那麼就需要用到了深拷貝。

深拷貝,呼叫的copy模組的deepcopy()方法,可以將當前的物件完全拷貝乙份,如圖所示。

首先根據示例來看,深拷貝確實重新建立了乙個物件,這點和淺拷貝剛開始是一樣的。

可以看出來原子型別的位址是不變的,但是容器型別的位址是變化的,那麼是不是因為這些原子型別的數值小,所以記憶體位址是固定的,換乙個大點的數值做實驗。

可以看出來原子型別的值確實只是引用的之前的位址,但是對於容器型別的值,確實建立了新的物件,那麼對於子元素的子元素適應嗎?

根據截圖來看,深拷貝會將所有的容器型別全都重新生成乙個物件來引用,對於所有的原子型別會沿用之前的位址。

python深淺copy和賦值

基於引用和物件 python引用和物件分離 直接賦值 a b a,b兩個引用指向相同的物件 淺copy a為b的copy copy 新建 b的不可變子物件,共用可變子物件 深copy a為b的深copy copy 新建 b的所有子物件,兩者物件無關聯 詳細解析如下 在python中,物件賦值實際上是...

python中的深淺拷貝與賦值。

賦值 賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。當使用可變資料結構時 如 list,dict,set 其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。a 1 2,3 b ab 1 4print id a a,id b b 1992269718152 1,...

python中的賦值與深淺拷貝

在python中,只有在int和字串,元組等不可變型別中,與深淺拷貝的結果一樣 因為其是不可變型別,都是連記憶體位址一起 複製 了。而在list,dict,set中,深淺拷貝並沒有複製 位址 複製 記憶體位址的結果就是,之後的操作會影響原來的物件。以下所有的內容都是基於記憶體位址來說的。1.int型...