Python 里的淺拷貝和深拷貝

淺拷貝

復(fù)制列表或者多數(shù)內(nèi)置的可變集合卵酪,最簡單的方式是使用內(nèi)置的類型構(gòu)造方法。比如表格里第二行谤碳,l2=list(l1)溃卡,還能用l2=l1[:]來創(chuàng)建副本。也能用模塊copy來創(chuàng)建淺拷貝副本估蹄。

*關(guān)于[:]塑煎,可以來看下LeetCode第 283 題 Move Zeroes,很巧妙的用了[:]解決問題臭蚁,運行時間超過了 99% 的submissions最铁。

構(gòu)造方法list[:]做的就是淺拷貝(淺復(fù)制)讯赏,也就是復(fù)制了最外層的容器,復(fù)制后的副本中的元素是原容器中元素的引用冷尉。

  • 如果所有元素都是不可變的漱挎,那么沒有問題。但是如果有可變的元素雀哨,可能就會導(dǎo)致意想不到的問題磕谅。
輸入
1 l1 = [3, [55,44,66], (7,8,9)]
2 l2 = list(l1)
3 l1.append(100)
4 l1[1].remove(55)
5 print("l1:", l1)
6 print("l2:",l2)
7 l2[1] += [33,22]
8 l2[2] +=(10,11)
9 print("l1:", l1)
10 print("l2:",l2)

output:

  • In [1]: l1: [3, [44, 66], (7, 8, 9), 100]

  • In [2]: l2: [3, [44, 66], (7, 8, 9)]

  • In [3]: l1: [3, [44, 66, 33, 22], (7, 8, 9), 100]

  • In [4]: l2: [3, [44, 66, 33, 22], (7, 8, 9, 10, 11)]

    例如:

    1. 在第 3 行,我們向l1的容器里 append100雾棺,但是從打印的結(jié)果 In [1]ln [2]來看膊夹,l2的容器并未發(fā)生變化。這里說的是對于元素100來說捌浩;在輸入第 4 行放刨,我們對l1[1]這個列表[55,44,66]進(jìn)行了remove(55)的操作,從輸出的結(jié)果來看尸饺,l1l2的列表都發(fā)生了變化进统。這個就是淺拷貝的作用,即淺拷貝復(fù)制了外層容器浪听,但是內(nèi)部的對象引用是相同的螟碎。如果內(nèi)部的引用發(fā)生變化,那對應(yīng)淺拷貝得到的副本里的特定對象也將隨著改變迹栓。再比如我們在第 7 行掉分,也進(jìn)行了擴(kuò)大列表的操作,而對應(yīng)的ln[3]ln[4]變化是相同的迈螟。
    2. 但對于不可變的元組來說叉抡,和列表就不一樣了尔崔。在第 8 行的輸入中答毫,我們向 l2[2]的元組(7,8,9)增加了(10,11)元組,但從輸出ln [3]ln [4]來看季春,ln [3]的元組并未發(fā)生改變洗搂。這是為什么呢?這是因為元組在擴(kuò)大的時候载弄,直接創(chuàng)建了一個新的元組耘拇,和原來l1里的元組(7,8,9)完全無關(guān)。

副本和原容器相等宇攻,但是二者指代不一樣的對象:

>>> l1 = [3, [55,44,66], (7,8,9)]
>>> l2 = list(l1)
>>> l2
[3, [55,44,66], (7,8,9)]
>>> l2 == l1
True
>>> l2 is l1
False

深拷貝

copy模塊的copydeepcopy分別用來創(chuàng)建淺拷貝和深拷貝副本:
如本文所述惫叛,淺拷貝得到的b列表里的列表[1,2]會受到原容器里的列表[1,2]remove(1)操作的影響,因為ab里的[1,2]指向的是同一引用逞刷;而深拷貝得到的副本c完全就是另一個對象了嘉涌,c的原容器a無論怎么發(fā)生變化妻熊,都和c沒關(guān)系。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仑最,一起剝皮案震驚了整個濱河市扔役,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌警医,老刑警劉巖亿胸,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異预皇,居然都是意外死亡侈玄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門吟温,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拗馒,“玉大人,你說我怎么就攤上這事溯街∮展穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵呈昔,是天一觀的道長挥等。 經(jīng)常有香客問我,道長堤尾,這世上最難降的妖魔是什么肝劲? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮郭宝,結(jié)果婚禮上辞槐,老公的妹妹穿的比我還像新娘。我一直安慰自己粘室,他們只是感情好榄檬,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衔统,像睡著了一般鹿榜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锦爵,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天舱殿,我揣著相機(jī)與錄音,去河邊找鬼险掀。 笑死沪袭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的樟氢。 我是一名探鬼主播冈绊,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼创倔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焚碌?” 一聲冷哼從身側(cè)響起畦攘,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎十电,沒想到半個月后知押,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鹃骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年台盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畏线。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡静盅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寝殴,到底是詐尸還是另有隱情蒿叠,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布蚣常,位于F島的核電站市咽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抵蚊。R本人自食惡果不足惜施绎,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贞绳。 院中可真熱鬧谷醉,春花似錦、人聲如沸冈闭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拒秘。三九已至号显,卻和暖如春臭猜,著一層夾襖步出監(jiān)牢的瞬間躺酒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工蔑歌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留羹应,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓次屠,卻偏偏與公主長得像园匹,于是被迫代替她去往敵國和親雳刺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354