這篇文章主要介紹Python賦值與拷貝的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司是專業(yè)的樂亭網(wǎng)站建設(shè)公司,樂亭接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行樂亭網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!變量與賦值
在 Python 中,一切皆為對象,對象通過「變量名」引用,「變量名」更確切的叫法是「名字」,好比我們每個人都有自己的名字一樣,咱們通過名字來代指某個人,代碼里面通過名字來指代某個對象。
變量賦值就是給對象綁定一個名字,賦值并不會拷貝對象。好比我們出生的時候父母就要給我們?nèi)∫粋€名字一樣,給人取個綽號并不來多出一個人來,只是多一個名字罷了。
兩個對象做比較有兩種方式,分別是:is 與 == ,is比較的是兩個對象是否相同,通過對象的ID值可識別是否為相同對象,==比較的是兩個對象的值是否相等
>>> x1 = [1,2] >>> x2 = [1,2] >>> x1 is x2 False >>> id(x1) 4338854088 >>> id(x2) 4338904392 >>> x1 == x2 True
x1 和 x2 的值雖然相同,但在內(nèi)存中是兩個獨立的不同的對象,占據(jù)不同的內(nèi)存空間,就好比兩個長得一樣的蘋果擺在桌子上,實則為兩個不同的物體。
>>> x3 = x2 >>> x3 is x2 True >>> id(x3) 4338904392
前面說了,賦值是給對象綁定名字,這里我們只不過是給 x2 對應(yīng)的那個對象綁定了一個新的名字叫 x3,這就好比桌上放了一個蘋果,開始給它貼了一個 x2 的標簽,后來又給它添了一個 x3 的標簽,本質(zhì)上還是同一個蘋果,所以,x2 和 x3 所指的其實是同一個對象。
通過x2 修改對象時,x3 也會跟著變化,因為本質(zhì)上它們是同一個對象,這就好比張三和小張是同一個人時,給張三添衣服其實就是給小張?zhí)硪路?/p>
>>> x2.append(3) >>> x2 [1, 2, 3] >>> x3 [1, 2, 3]
但是,當(dāng)我給 x2 重新賦值時,相當(dāng)于 x2 不再引用之前的對象,而引用新對象, x3 依然引用之前的對象。好比桌上一大蘋果開始貼了 x2 和 x3 兩個標簽,給 x2 重新賦值就相當(dāng)于把 x2 標簽貼到另外一個蘋果,但是 x3 還是貼在老蘋果身上。
>>> x2 = [3, 4] >>> x3 [1, 2, 3]
對象拷貝
在業(yè)務(wù)中有時我們需要復(fù)制一個對象,但是又不想對原對象產(chǎn)生副作用,肯定不能通過賦值給一個新變量來解決(因為賦值不是拷貝對象),所以 Python 專門提供了一種拷貝機制,基于原對象快速創(chuàng)建出一個含有相同值的對象。該功能由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)有什么區(qū)別呢?
對于不可變對象,比如整數(shù)、字符串、元組、還有由這些不可變對象組成的集合對象,淺拷貝和深拷貝沒有區(qū)別,都是拷貝一個新對象
兩者的區(qū)別在于拷貝組合對象,比如列表中還有列表,字典中還有字典或者列表的情況時,淺拷貝只拷貝了外面的殼子,里面的元素并沒有拷貝,而深拷貝則是把殼子和里面的元素都拷貝了一份新的。
來看一個例子:
>>> x = [2, 3] >>> y = [7, 11] >>> z = [x, y] >>> a = copy.copy(z) # 淺拷貝 >>> a[0] is z[0] True
拷貝出來的對象 a 中的元素引用的是 x 和 y,當(dāng)你修改 x 的值,a 也會跟著變。
>>> b = copy.deepcopy(z) # 深拷貝 >>> b[0] is z[0] False
對于深拷貝,里面的元素也重新拷貝了一份,拷貝了一份與x和y等值的兩個元素,修改 x 和 y 的值,不會對 b 產(chǎn)生影響
對列表的切片拷貝z[:]或者是調(diào)用對象的copy方法list.copy()都屬于淺拷貝。對于自定義對象,我們還可以自己實現(xiàn)__copy__方法和__deepcopy__方法
以上是“Python賦值與拷貝的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。