當前位置:
首頁 > 最新 > 一篇文章讀懂Python賦值與拷貝

一篇文章讀懂Python賦值與拷貝

題圖:Photo by Massimiliano Donghi on Unsplash


在 Python 中,一切皆為對象,對象通過「變數名」引用,「變數名」更確切的叫法是「名字」,好比我們每個人都有自己的名字一樣,咱們通過名字來代指某個人,代碼裡面通過名字來指代某個對象。

變數賦值就是給對象綁定一個名字,賦值並不會拷貝對象。好比我們出生的時候父母就要給我們取一個名字一樣,給人取個綽號並不來多出一個人來,只是多一個名字罷了。

兩個對象做比較有兩種方式,分別是:is 與 == , 比較的是兩個對象是否相同,通過對象的ID值可識別是否為相同對象, 比較的是兩個對象的值是否相等

x1 和 x2 的值雖然相同,但在內存中是兩個獨立的不同的對象,佔據不同的內存空間,就好比兩個長得一樣的蘋果擺在桌子上,實則為兩個不同的物體。

前面說了,賦值是給對象綁定名字,這裡我們只不過是給 x2 對應的那個對象綁定了一個新的名字叫 x3,這就好比桌上放了一個蘋果,開始給它貼了一個 x2 的標籤,後來又給它添了一個 x3 的標籤,本質上還是同一個蘋果,所以,x2 和 x3 所指的其實是同一個對象。

通過x2 修改對象時,x3 也會跟著變化,因為本質上它們是同一個對象,這就好比張三和小張是同一個人時,給張三添衣服其實就是給小張添衣服。

但是,當我給 x2 重新賦值時,相當於 x2 不再引用之前的對象,而引用新對象, x3 依然引用之前的對象。好比桌上一大蘋果開始貼了 x2 和 x3 兩個標籤,給 x2 重新賦值就相當於把 x2 標籤貼到另外一個蘋果,但是 x3 還是貼在老蘋果身上。


在業務中有時我們需要複製一個對象,但是又不想對原對象產生副作用,肯定不能通過賦值給一個新變數來解決(因為賦值不是拷貝對象),所以 Python 專門提供了一種拷貝機制,基於原對象快速創建出一個含有相同值的對象。該功能由 模塊提供。

拷貝又分為淺拷貝和深拷貝。

拷貝出來的對象只是值相同,實為不同的對象

那麼淺拷貝(shallow copy)與深拷貝(deep copy)有什麼區別呢?

對於不可變對象,比如整數、字元串、元組、還有由這些不可變對象組成的集合對象,淺拷貝和深拷貝沒有區別,都是拷貝一個新對象

兩者的區別在於拷貝組合對象,比如列表中還有列表,字典中還有字典或者列表的情況時,淺拷貝只拷貝了外面的殼子,裡面的元素並沒有拷貝,而深拷貝則是把殼子和裡面的元素都拷貝了一份新的。

來看一個例子:

拷貝出來的對象 a 中的元素引用的是 x 和 y,當你修改 x 的值,a 也會跟著變。

對於深拷貝,裡面的元素也重新拷貝了一份,拷貝了一份與x和y等值的兩個元素,修改 x 和 y 的值,不會對 b 產生影響

對列表的切片拷貝 或者是調用對象的copy方法 都屬於淺拷貝。對於自定義對象,我們還可以自己實現 方法和 方法

關注Python之禪,做全棧工程師


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python編程學習之如何傳遞運算表達式,原來只差這一點
Python+Memcached:在分散式應用程序中實現高效緩存

TAG:Python |