深淺拷貝

 我們已經(jīng)詳細(xì)了解了變量賦值的過程点待。對于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來說,賦值就等于完全共享了資源弃舒,一個值的改變會完全被另一個值共享癞埠。

  然而有的時(shí)候,我們偏偏需要將一份數(shù)據(jù)的原始內(nèi)容保留一份,再去處理數(shù)據(jù)燕差,這個時(shí)候使用賦值就不夠明智了。python為這種需求提供了copy模塊坝冕。提供了兩種主要的copy方法徒探,一種是普通的copy,另一種是deepcopy喂窟。我們稱前者是淺拷貝测暗,后者為深拷貝。

  深淺拷貝一直是所有編程語言的重要知識點(diǎn)磨澡,下面我們就從內(nèi)存的角度來分析一下兩者的區(qū)別碗啄。

? ? ? ?首先,我們來了解一下淺拷貝稳摄。淺拷貝:不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu)稚字,淺拷貝都只會copy一層。下面就讓我們看一張圖厦酬,來了解一下淺淺拷貝的概念胆描。


?看上面兩張圖,我們加入左圖表示的是一個列表sourcelist仗阅,sourcelist =?['str1','str2','str3','str4','str5',['str1','str2','str3','str4','str5']]昌讲;

  右圖在原有的基礎(chǔ)上多出了一個淺拷貝的copylist,copylist =?['str1','str2','str3','str4','str5',['str1','str2','str3','str4','str5']]减噪;

  sourcelist和copylist表面上看起來一模一樣短绸,但是實(shí)際上在內(nèi)存中已經(jīng)生成了一個新列表,copy了sourceLst筹裕,獲得了一個新列表醋闭,存儲了5個字符串和一個列表所在內(nèi)存的地址。

? ? ? 我們看下面分別對兩個列表進(jìn)行的操作朝卒,紅色的框框里面是變量初始化目尖,初始化了上面的兩個列表;我們可以分別對這兩個列表進(jìn)行操作扎运,例如插入一個值瑟曲,我們會發(fā)現(xiàn)什么呢?如下所示:

? ? ? ?從上面的代碼我們可以看出豪治,對于sourceLst和copyLst列表添加一個元素洞拨,這兩個列表好像是獨(dú)立的一樣都分別發(fā)生了變化,但是當(dāng)我修改lst的時(shí)候负拟,這兩個列表都發(fā)生了變化烦衣,這是為什么呢?我們就來看一張內(nèi)存中的變化圖:


  我們可以知道sourceLst和copyLst列表中都存儲了一坨地址,當(dāng)我們修改了sourceLst1的元素時(shí)花吟,相當(dāng)于用'sourceChange'的地址替換了原來'str1'的地址秸歧,所以sourceLst的第一個元素發(fā)生了變化。而copyLst還是存儲了str1的地址衅澈,所以copyLst不會發(fā)生改變键菱。

  當(dāng)sourceLst列表發(fā)生變化,copyLst中存儲的lst內(nèi)存地址沒有改變今布,所以當(dāng)lst發(fā)生改變的時(shí)候经备,sourceLst和copyLst兩個列表就都發(fā)生了改變。

  這種情況發(fā)生在字典套字典部默、列表套字典侵蒙、字典套列表,列表套列表傅蹂,以及各種復(fù)雜數(shù)據(jù)結(jié)構(gòu)的嵌套中纷闺,所以當(dāng)我們的數(shù)據(jù)類型很復(fù)雜的時(shí)候,用copy去進(jìn)行淺拷貝就要非常小心份蝴。急但。。

  剛剛我們了解了淺拷貝的意義搞乏,但是在寫程序的時(shí)候波桩,我們就是希望復(fù)雜的數(shù)據(jù)結(jié)構(gòu)之間完全copy一份并且它們之間又沒有一毛錢關(guān)系,應(yīng)該怎么辦呢请敦?

  我們引入一個深拷貝的概念镐躲,深拷貝——即python的copy模塊提供的另一個deepcopy方法。深拷貝會完全復(fù)制原變量相關(guān)的所有數(shù)據(jù)侍筛,在內(nèi)存中生成一套完全一樣的內(nèi)容萤皂,在這個過程中我們對這兩個變量中的一個進(jìn)行任意修改都不會影響其他變量。下面我們就來試驗(yàn)一下匣椰。

? ? ? 看上面的執(zhí)行結(jié)果裆熙,這一次我們不管是對直接對列表進(jìn)行操作還是對列表內(nèi)嵌套的其他數(shù)據(jù)結(jié)構(gòu)操作,都不會產(chǎn)生拷貝的列表受影響的情況禽笑。我們再來看看這些變量在內(nèi)存中的狀況:

看了上面的內(nèi)容入录,我們就知道了深拷貝的原理。其實(shí)深拷貝就是在內(nèi)存中重新開辟一塊空間佳镜,不管數(shù)據(jù)結(jié)構(gòu)多么復(fù)雜僚稿,只要遇到可能發(fā)生改變的數(shù)據(jù)類型,就重新開辟一塊內(nèi)存空間把內(nèi)容復(fù)制下來蟀伸,直到最后一層蚀同,不再有復(fù)雜的數(shù)據(jù)類型缅刽,就保持其原引用。這樣蠢络,不管數(shù)據(jù)結(jié)構(gòu)多么的復(fù)雜衰猛,數(shù)據(jù)之間的修改都不會相互影響。這就是深拷貝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刹孔,一起剝皮案震驚了整個濱河市啡省,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦疏,老刑警劉巖冕杠,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微姊,死亡現(xiàn)場離奇詭異酸茴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兢交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門薪捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人配喳,你說我怎么就攤上這事酪穿。” “怎么了晴裹?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵被济,是天一觀的道長。 經(jīng)常有香客問我涧团,道長只磷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任泌绣,我火速辦了婚禮钮追,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阿迈。我一直安慰自己元媚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布苗沧。 她就那樣靜靜地躺著刊棕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待逞。 梳的紋絲不亂的頭發(fā)上鞠绰,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音飒焦,去河邊找鬼蜈膨。 笑死屿笼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翁巍。 我是一名探鬼主播驴一,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灶壶!你這毒婦竟也來了肝断?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驰凛,失蹤者是張志新(化名)和其女友劉穎胸懈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰响,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趣钱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胚宦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首有。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枢劝,靈堂內(nèi)的尸體忽然破棺而出井联,到底是詐尸還是另有隱情,我是刑警寧澤您旁,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布烙常,位于F島的核電站,受9級特大地震影響鹤盒,放射性物質(zhì)發(fā)生泄漏蚕脏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一昨悼、第九天 我趴在偏房一處隱蔽的房頂上張望蝗锥。 院中可真熱鬧,春花似錦率触、人聲如沸终议。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穴张。三九已至,卻和暖如春两曼,著一層夾襖步出監(jiān)牢的瞬間皂甘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工悼凑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偿枕,地道東北人璧瞬。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像渐夸,于是被迫代替她去往敵國和親嗤锉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容