亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 1609 0

變量與賦值

在 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 對應的那個對象綁定了一個新的名字叫 x3,這就好比桌上放了一個蘋果,開始給它貼了一個 x2 的標簽,后來又給它添了一個 x3 的標簽,本質上還是同一個蘋果,所以,x2 和 x3 所指的其實是同一個對象。

一篇文章讀懂Python賦值與拷貝_第1張圖片

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

            
>>> 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賦值與拷貝_第2張圖片

對象拷貝

在業(yè)務中有時我們需要復制一個對象,但是又不想對原對象產(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
          

一篇文章讀懂Python賦值與拷貝_第3張圖片

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

            
>>> b = copy.deepcopy(z) # 深拷貝
>>> b[0] is z[0]
False
          

一篇文章讀懂Python賦值與拷貝_第4張圖片

對于深拷貝,里面的元素也重新拷貝了一份,拷貝了一份與x和y等值的兩個元素,修改 x 和 y 的值,不會對 b 產(chǎn)生影響

對列表的切片拷貝z[:]或者是調用對象的copy方法list.copy()都屬于淺拷貝。對于自定義對象,我們還可以自己實現(xiàn)__copy__方法和__deepcopy__方法

總結

以上所述是小編給大家介紹的通過一篇文章讀懂Python賦值與拷貝,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费中日高清无专码有限公司 | 中文字幕一区久久久久 | 欧美日韩中文字幕在线 | 一a一片一级一片啪啪 | 精品一区二区三区中文字幕 | 国产美女久久久久久久久久久 | 久久精品综合国产二区 | 日本aaaa毛片在线看 | 亚洲国产精品一区 | 亚洲精品香蕉一区二区在线观看 | 国产精品一区二区三 | 亚洲a区视频 | 成人免费牛牛在线视频 | 在线视频综合网 | 国产在线观看自拍 | 日韩成人在线视频 | 久久久国产精品视频 | 精品久久久久久蜜臂a∨ | 国产尤物福利视频在线观看 | 奇米在线播放 | 波多野结衣中文无毒不卡 | 国产亚洲综合一区二区在线 | 成人毛片免费视频播放 | 草逼网站 | 国产91在线 | 日本 | 免费一级特黄视频 | 国产精品玖玖玖影院 | 国产成人精视频在线观看免费 | 精品91在线| 日日操天天爽 | 国产二区精品视频 | 99久久国产亚洲综合精品 | 94在线成人免费视频 | 欧美91在线| 亚洲欧美国产五月天综合 | 99资源| 久久精品免看国产 | 韩日免费视频 | 日本亚洲精品久久 | 久久亚洲精品成人 | 久久精品国产丝袜 |