<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

      問題解析:Python中的變量復(fù)制備份,為什么沒有達(dá)到效果?

      0
      分享至

      背景

      在運(yùn)用Python進(jìn)行開發(fā)代碼過程中,會(huì)遇到變量復(fù)制備份的場(chǎng)景,但并沒有得到預(yù)期的結(jié)果,例如下面的例子:



      lista = ['a', 'b', [1, 2, 3]]

      listb = lista.copy()

      lista[2].append(4)

      print(lista) # ['a', 'b', [1, 2, 3, 4]]

      print(listb) # ['a', 'b', [1, 2, 3, 4]]

      代碼本意是將lista復(fù)制給listb做個(gè)備份,再修改liasta,但是修改后發(fā)現(xiàn)listb也一并被修改了,沒有達(dá)到備份的效果,這個(gè)是什么原因呢?

      存儲(chǔ)方式

      首先了解一下Python的變量在內(nèi)存中的存儲(chǔ)方式。在基本數(shù)據(jù)類型中(包括set、list(tuple, str)、dict)都是采用引用的方式。

      也就是說,每個(gè)變量都存儲(chǔ)的是這個(gè)變量的地址,而不是值本身,就算更復(fù)雜的嵌套結(jié)構(gòu),也是存儲(chǔ)是每個(gè)元素的地址而已,用一幅圖來表示。



      如上圖所示,用戶看到的是 lista的4個(gè)元素值,但是內(nèi)存中保存的卻是4個(gè)元素地址。

      當(dāng)元素是列表時(shí),第一層保存的是列表的地址,第二層保存的是列表元素的地址,第三層才是列表的值。當(dāng)元素是字典的時(shí)候,與列表類似。

      列表的增刪改

      在明白了變量存儲(chǔ)方式后,繼續(xù)看下內(nèi)存下的增刪改是怎么變化的。

      列表修改已有值

      新增一個(gè)內(nèi)存塊,再將引用的地址修改為新內(nèi)存塊的地址。



      列表新增一個(gè)值

      新增一個(gè)內(nèi)存塊,新增一個(gè)地址引用。



      列表整體重新賦值

      刪除變量地址和引用的值,新增地址和引用值的內(nèi)存塊。



      copy與deepcopy的區(qū)別

      基于以上的理解,再來看兩種copy的區(qū)別就會(huì)更容易理解了,首先記住一個(gè)原則:

      copy:不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層。

      deepcopy:將整個(gè)變量?jī)?nèi)存全部復(fù)制一遍,新變量與原變量沒有任何關(guān)系。

      舉個(gè)例子來驗(yàn)證一下上面的結(jié)論:有如下的一段代碼,最終的4個(gè)列表值是多少?

      注意:引用deepcopy需要導(dǎo)入copy庫。

      import copy

      a = [1, 2, 3, 4, ['a', 'b']]

      b = a

      c = copy.copy(a)

      d = copy.deepcopy(a)

      a.append(5)

      a[1] = 20

      a[4].append('c')

      del a[0]

      print(a)

      print(b)

      print(c)

      print(d)

      列表b

      表示b也引用的a的地址,兩者引用的內(nèi)存地址是一樣的。因此b和a的關(guān)系是緊密相連的,一模一樣。可以通過 id(a) 和id(b)比較,兩者是一樣的。

      列表c

      由于c是淺拷貝的a列表,因此只copy了第一層,也就是地址層。

      所以,當(dāng)a.append(5)時(shí),新增了一個(gè)內(nèi)存塊,但是c只有前5個(gè)內(nèi)存塊,因此c沒有變化。

      繼續(xù)a修改了a[1],然而這個(gè)值是屬于第一層,已經(jīng)copy給了c,因此c也沒有變化。

      繼續(xù)a修改了子列表,這個(gè)時(shí)候a復(fù)制給c的只是列表的地址,且a中的子列表地址和c中的子列表地址是指向同一個(gè)地方的,因此修改了a中子列表,c中的子列表也會(huì)相應(yīng)的改變。

      最后刪除a[0],與修改a[1]一致,與c無關(guān)。可以用圖再說明一下。



      列表d

      由于d是深拷貝的a列表,因此d是將a的地址和值一并復(fù)制過來,與a沒有半點(diǎn)關(guān)系,也就是說d和a是兩個(gè)完全獨(dú)立的內(nèi)存塊,沒有任何交集。因此,后面a的任意修改都與d無關(guān),用圖表示如下。



      因此,程序運(yùn)行出來后的結(jié)果就是:

      a:[20,3,4,['a','b','c'],5]

      b:[20,3,4,['a','b','c'],5]

      c:[1,2,3,4,['a','b','c']]

      d:[1,2,3,4,['a','b']]

      總結(jié)

      綜上,我們?cè)谑褂胏opy的時(shí)候,一定要記住:copy只是拷貝了第一層,而deepcopy才是拷貝的全部數(shù)據(jù)。

      因此就不難發(fā)現(xiàn),文章背景中的代碼使用備份功能時(shí),備份列表需要使用deepcopy,而不是簡(jiǎn)單的copy。

      最后:在我的V :atstudy-js,可以費(fèi)領(lǐng)取一份10G軟件測(cè)試工程師面試寶典文檔資料。以及相對(duì)應(yīng)的視頻學(xué)習(xí)教程免費(fèi)分享!其中包括了有基礎(chǔ)知識(shí)、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫、抓包工具專題、接口測(cè)試工具、測(cè)試進(jìn)階-Python編程、Web自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試、測(cè)試高級(jí)持續(xù)集成、測(cè)試架構(gòu)開發(fā)測(cè)試框架、性能測(cè)試、安全測(cè)試等。


      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關(guān)推薦
      熱點(diǎn)推薦
      拉什福德接受19萬周薪,永久轉(zhuǎn)會(huì)巴薩已定!曼聯(lián)不降價(jià)但同意分期

      拉什福德接受19萬周薪,永久轉(zhuǎn)會(huì)巴薩已定!曼聯(lián)不降價(jià)但同意分期

      羅米的曼聯(lián)博客
      2026-02-28 10:42:01
      不慣著!女子回婆家過年,車被妯娌砸爛,報(bào)警硬剛到底,結(jié)局亮了

      不慣著!女子回婆家過年,車被妯娌砸爛,報(bào)警硬剛到底,結(jié)局亮了

      川渝視覺
      2026-02-28 09:15:48
      世界首次五百強(qiáng)30 年反轉(zhuǎn),日本149家,美國(guó)151家,中國(guó)3家

      世界首次五百強(qiáng)30 年反轉(zhuǎn),日本149家,美國(guó)151家,中國(guó)3家

      愛吃醋的貓咪
      2026-02-27 17:51:23
      中國(guó)要做好戰(zhàn)爭(zhēng)準(zhǔn)備,中國(guó)的下場(chǎng)戰(zhàn)爭(zhēng)不是印度菲律賓越南而是日本

      中國(guó)要做好戰(zhàn)爭(zhēng)準(zhǔn)備,中國(guó)的下場(chǎng)戰(zhàn)爭(zhēng)不是印度菲律賓越南而是日本

      百態(tài)人間
      2026-01-09 17:17:17
      新加坡大滿貫賽:大捷報(bào)!林昀儒4:1淘汰世界亞軍,晉級(jí)男單4強(qiáng)

      新加坡大滿貫賽:大捷報(bào)!林昀儒4:1淘汰世界亞軍,晉級(jí)男單4強(qiáng)

      國(guó)乒二三事
      2026-02-28 19:55:46
      把天捅破!美國(guó)駐以色列大使:若以色列拿下整個(gè)中東,那也沒問題

      把天捅破!美國(guó)駐以色列大使:若以色列拿下整個(gè)中東,那也沒問題

      達(dá)文西看世界
      2026-02-22 21:18:10
      每天4點(diǎn)起床做包子,這位00后上海小囡,在國(guó)企食堂干出了全網(wǎng)羨慕的松弛感!

      每天4點(diǎn)起床做包子,這位00后上海小囡,在國(guó)企食堂干出了全網(wǎng)羨慕的松弛感!

      新民晚報(bào)
      2026-02-28 21:23:57
      34歲評(píng)上副教授,直接躺平15年!山東一教師自曝生活狀態(tài),引爭(zhēng)議

      34歲評(píng)上副教授,直接躺平15年!山東一教師自曝生活狀態(tài),引爭(zhēng)議

      火山詩話
      2026-02-27 09:09:49
      網(wǎng)傳阿塔最高領(lǐng)導(dǎo)人阿洪扎達(dá)在空襲中身亡

      網(wǎng)傳阿塔最高領(lǐng)導(dǎo)人阿洪扎達(dá)在空襲中身亡

      頭條爆料007
      2026-02-28 06:29:13
      馬布里,48歲,剛領(lǐng)著一位中國(guó)姑娘去領(lǐng)了證。

      馬布里,48歲,剛領(lǐng)著一位中國(guó)姑娘去領(lǐng)了證。

      南權(quán)先生
      2026-02-28 15:50:16
      完全體廣東來了!崔永熙首秀,徐杰正式復(fù)出,杜鋒打響爭(zhēng)冠第一槍

      完全體廣東來了!崔永熙首秀,徐杰正式復(fù)出,杜鋒打響爭(zhēng)冠第一槍

      多特體育說
      2026-02-28 21:59:57
      梅西封神了!球王之爭(zhēng)已經(jīng)終結(jié),歷史第一人再無懸念

      梅西封神了!球王之爭(zhēng)已經(jīng)終結(jié),歷史第一人再無懸念

      籃球看比賽
      2026-02-28 17:05:26
      寶馬iX給出最大誠意!售價(jià)直降23.79萬,網(wǎng)友:有它不要奔馳

      寶馬iX給出最大誠意!售價(jià)直降23.79萬,網(wǎng)友:有它不要奔馳

      汽車網(wǎng)評(píng)
      2026-02-28 21:28:03
      為什么這次伊朗不升旗了?因?yàn)樯斓牡胤揭呀?jīng)被炸了

      為什么這次伊朗不升旗了?因?yàn)樯斓牡胤揭呀?jīng)被炸了

      怪口歷史的K先生
      2026-02-28 17:12:58
      44歲高云翔天津街邊攤煎餅,穿著樸素動(dòng)作生澀,直言找到新工作了

      44歲高云翔天津街邊攤煎餅,穿著樸素動(dòng)作生澀,直言找到新工作了

      一盅情懷
      2026-02-28 17:55:12
      內(nèi)馬爾:我跟維尼修斯說,他進(jìn)球再做和首回合同樣的慶祝動(dòng)作

      內(nèi)馬爾:我跟維尼修斯說,他進(jìn)球再做和首回合同樣的慶祝動(dòng)作

      懂球帝
      2026-02-28 19:27:26
      梅婷大年初九在北京別墅宴客,和德華劉琳同框,吃海鮮大口喝酒

      梅婷大年初九在北京別墅宴客,和德華劉琳同框,吃海鮮大口喝酒

      林雁飛
      2026-02-27 16:36:10
      美方要求中方參加中美俄三邊核裁軍談判,外交部:不公平、不合理也不可行!“中國(guó)的核力量同美俄完全不在一個(gè)量級(jí)”

      美方要求中方參加中美俄三邊核裁軍談判,外交部:不公平、不合理也不可行!“中國(guó)的核力量同美俄完全不在一個(gè)量級(jí)”

      每日經(jīng)濟(jì)新聞
      2026-02-27 17:25:20
      特朗普說等行動(dòng)結(jié)束接管伊朗政府

      特朗普說等行動(dòng)結(jié)束接管伊朗政府

      財(cái)聯(lián)社
      2026-02-28 16:38:07
      俄羅斯全境響起導(dǎo)彈警報(bào)聲,伊朗陸軍司令確定已死亡

      俄羅斯全境響起導(dǎo)彈警報(bào)聲,伊朗陸軍司令確定已死亡

      史政先鋒
      2026-02-28 22:13:45
      2026-02-28 23:16:49
      51Testing軟件測(cè)試網(wǎng) incentive-icons
      51Testing軟件測(cè)試網(wǎng)
      中國(guó)軟件測(cè)試人的精神家園
      1528文章數(shù) 13252關(guān)注度
      往期回顧 全部

      科技要聞

      狂攬1100億美元!OpenAI再創(chuàng)融資神話

      頭條要聞

      美以襲擊伊朗 華人緊急逃離德黑蘭:沒想到來得這么快

      頭條要聞

      美以襲擊伊朗 華人緊急逃離德黑蘭:沒想到來得這么快

      體育要聞

      球隊(duì)主力全報(bào)銷?頂風(fēng)擺爛演都不演了

      娛樂要聞

      周杰倫兒子正面照曝光,與父親好像

      財(cái)經(jīng)要聞

      沖突爆發(fā) 市場(chǎng)變天?

      汽車要聞

      嵐圖泰山黑武士版3月上市 搭載華為四激光智駕方案

      態(tài)度原創(chuàng)

      家居
      健康
      房產(chǎn)
      教育
      軍事航空

      家居要聞

      素色肌理 品意式格調(diào)

      轉(zhuǎn)頭就暈的耳石癥,能開車上班嗎?

      房產(chǎn)要聞

      濱江九小也來了!集齊海僑北+哈羅、寰島...江東教育要炸了!

      教育要聞

      這件事不做對(duì),將來孩子會(huì)恨你!

      軍事要聞

      美國(guó)以色列聯(lián)合襲擊伊朗 實(shí)時(shí)戰(zhàn)況

      無障礙瀏覽 進(jìn)入關(guān)懷版