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

直接賦值

在Python中直接賦值其實只是將引用地址之間的傳遞。
直接賦值-原子類型
如圖所示,這是python中原子類型的賦值結果,當你修改變量1的時候,變量2的值並不會隨着改變。接下來看一下容器類型[list, dict, set…]的賦值情況,我以列表類型舉例:
直接賦值-容器類型
爲什麼修改了list1之後,list2的內容也會改變?
首先他和原子類型的區別在於原子類型是不可變的,所以你只能通過改變引用對象,指向的內存地址也就相應改變了,而列表本身是可變的,所以你可以直接對其進行修改,但是你的修改並不會改變這個列表的內存地址,只不過是可能修改了內部元素的所指向的內存地址,而列表本身會對其內部的元素進行一個維護。列表內存地址維護圖

淺拷貝

那麼如果我們想要一份同樣的數據,但是是不同的對象該怎麼辦?可以調用對象的copy()方法或者導入copy模塊,調用copy.copy()來生成原對象的一份淺拷貝。
淺拷貝-原子類型
根據截圖看到如果對列表進行元素的添加是支持的,但是子元素的內存地址是固定的,所以推測對於原子類型修改沒問題,但是對於容器類型的修改也會出現牽一髮而動全身的問題。
淺拷貝-子元素修改
根據截圖來看,確實符合之前的推斷只要他記得是容器的地址,那麼就會出現相互影響,如果想要徹徹底底沒有關係,那麼就需要用到了深拷貝。

深拷貝

深拷貝,調用的copy模塊的deepcopy()方法,可以將當前的對象完全拷貝一份,如圖所示。
深拷貝-拷貝對象
首先根據示例來看,深拷貝確實重新創建了一個對象,這點和淺拷貝剛開始是一樣的。
深拷貝-原子和容器類型初試
可以看出來原子類型的地址是不變的,但是容器類型的地址是變化的,那麼是不是因爲這些原子類型的數值小,所以內存地址是固定的,換一個大點的數值做實驗。
深拷貝-修改原子類型數值大小
可以看出來原子類型的值確實只是引用的之前的地址,但是對於容器類型的值,確實創建了新的對象,那麼對於子元素的子元素適應嗎?
深拷貝-子元素容器類型
根據截圖來看,深拷貝會將所有的容器類型全都重新生成一個對象來引用,對於所有的原子類型會沿用之前的地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章