本文跟大家分享一篇文章帶領大家讀懂python賦值與拷貝的知識,有興趣的朋友一起看看吧
##變數與賦值
在Python 中,一切皆為對象,對象通過“變量名”引用,“變量名”更確切的叫法是“名字”,好比我們每個人都有自己的名字一樣,咱們通過名字來代指某個人,代碼裡面透過名字來指涉某個物件。 變數賦值就是給物件綁定一個名字,賦值並不會拷貝物件。好比我們出生的時候父母就要給我們取一個名字一樣,給人取個綽號並不來多出一個人來,只是多一個名字罷了。 兩個物件做比較有兩種方式,分別是:is 與== ,is比較的是兩個物件是否相同,透過物件的ID值可辨識是否為相同對象,==比較的是兩個物件的值是否相等>>> x1 = [1,2] >>> x2 = [1,2] >>> x1 is x2 False >>> id(x1) 4338854088 >>> id(x2) 4338904392 >>> x1 == x2 Truex1 和x2 的值雖然相同,但在記憶體中是兩個獨立的不同的對象,佔據不同的記憶體空間,就好比兩個長得一樣的蘋果擺在桌上,實則為兩個不同的物體。
>>> x3 = x2 >>> x3 is x2 True >>> id(x3) 4338904392前面說了,賦值是給物件綁定名字,這裡我們只不過是給x2 對應的那個物件綁定了一個新的名字叫x3,這就好比桌上放了一個蘋果,開始給它貼了一個x2 的標籤,後來又給它添了一個x3 的標籤,本質上還是同一個蘋果,所以,x2 和x3 所指的其實是同一個對象。 透過x2 修改物件時,x3 也會跟著變化,因為本質上它們是同一個對象,這就好比張三和小張是同一個人時,給張三添衣服其實是給小張添衣服。
>>> x2.append(3) >>> x2 [1, 2, 3] >>> x3 [1, 2, 3]但是,當我給x2 重新賦值時,相當於x2 不再引用先前的對象,而引用新對象, x3 依然引用先前的對象。好比桌上一大蘋果開始貼了 x2 和 x3 兩個標籤,給 x2 重新賦值就相當於把 x2 標籤貼到另外一個蘋果,但是 x3 還是貼在老蘋果身上。
>>> x2 = [3, 4] >>> x3 [1, 2, 3]
#物件拷貝
在業務中有時我們需要複製一個對象,但又不想對原對象產生副作用,肯定不能透過賦值給一個新變數來解決(因為賦值不是拷貝對象),所以Python 專門提供了一種拷貝機制,基於原始對象快速創建出一個含有相同值的物件。此功能由copy模組提供。 拷貝又分為淺拷貝和深拷貝。>>> s = [1,2,3]>>> sc = copy.copy(s) # 浅拷贝>>> sc[1, 2, 3] >>> sdc = copy.deepcopy(s) # 深拷贝 >>> sdc [1, 2, 3]拷貝出來的物件只是值相同,實為不同的物件
>>> s == sc == sdc True >>> s is sc False >>> s is sdc False那麼淺拷貝(shallow copy)與深拷貝(deep copy)有什麼差別呢? 對於不可變對象,例如整數、字串、元組、還有由這些不可變對象組成的集合對象,淺拷貝和深拷貝沒有區別,都是拷貝一個新對象兩者的差別在於拷貝組合對象,例如列表中還有列表,字典中還有字典或列表的情況時,淺拷貝只拷貝了外面的殼子,裡面的元素並沒有拷貝,而深拷貝則是把殼子和裡面的元素都拷貝了一份新的。 來看一個例子:
>>> x = [2, 3] >>> y = [7, 11] >>> z = [x, y] >>> a = copy.copy(z) # 浅拷贝 >>> a[0] is z[0] True#拷貝出來的物件a 中的元素引用的是x 和y,當你修改x 的值,a 也會跟著變。
>>> b = copy.deepcopy(z) # 深拷贝 >>> b[0] is z[0] False對於深拷貝,裡面的元素也重新拷貝了一份,拷貝了一份與x和y等值的兩個元素,修改x 和y 的值,不會對b 產生影響對列表的切片拷貝z[:]或是呼叫物件的copy方法list.copy()都屬於淺拷貝。對於自訂對象,我們也可以自己實作__copy__方法和__deepcopy__方法相關推薦:
#
以上是Python賦值與拷貝的詳細內容。更多資訊請關注PHP中文網其他相關文章!