聊一聊Python中的淺拷貝和深拷貝

前言

我們知道列表是可變對(duì)象,指向他的變量都會(huì)根據(jù)他的變化而變化。

l1 = [1, 2, 3]
l2 = l1
l1.append(4)
print(l1, l2)

# [1, 2, 3, 4] [1, 2, 3, 4]

所以我們就要用拷貝方法,這樣就不會(huì)受其影響了。

l1 = [1, 2, 3]
l2 = list(l1)
l1.append(4)
print(l1, l2)

# [1, 2, 3, 4] [1, 2, 3]

那這里的l2 = list(l1)是淺拷貝還是深拷貝,你知道嗎?

淺拷貝

淺拷貝的方法主要有三種,通過(guò)數(shù)據(jù)構(gòu)造器(list、set)、切片,或者copy.copy()的方法。

import copy
l1 = [1, 2, 3]
l2 = list(l1)
l3 = l1[:]
l4 = copy.copy(l1)

淺拷貝意味著構(gòu)造一個(gè)新的集合對(duì)象,然后用原始對(duì)象中找到的子對(duì)象的引用來(lái)填充它。從本質(zhì)上講,淺層的復(fù)制只有一層的深度。我們來(lái)舉個(gè)例子。

l1 = [[1, 2], 3]
l2 = list(l1)
l1.append(4)
l1[0].append(5)
print(l1, l2)

# [[1, 2, 5], 3, 4]  [[1, 2, 5], 3]

由于淺拷貝是賦值一層,所以l1.append(4)不會(huì)影響l2,但第二層其實(shí)是對(duì)l1的引用,所以在嵌套列表中修改會(huì)影響l2。

深拷貝

要想拷貝對(duì)象與原對(duì)象完全沒(méi)有關(guān)系,就需要使用深拷貝,深拷貝用copy.deepcopy()方法。

import copy

l1 = [[1, 2], 3]
l2 = copy.deepcopy(l1)
l1.append(4)
l1[0].append(5)
print(l1, l2)

# [[1, 2, 5], 3, 4] [[1, 2], 3]

深拷貝使復(fù)制過(guò)程遞歸。這意味著首先構(gòu)造一個(gè)新的集合對(duì)象,然后遞歸地用在原始對(duì)象中找到的子對(duì)象的副本填充它。

今天的分享就到這了,我們下期再見(jiàn)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 淺拷貝 復(fù)制列表或者多數(shù)內(nèi)置的可變集合,最簡(jiǎn)單的方式是使用內(nèi)置的類(lèi)型構(gòu)造方法。比如表格里第二行,l2=list(l...
    w4irdo閱讀 345評(píng)論 0 1
  • 淺拷貝和深拷貝: 淺拷貝 shallow copy 淺拷貝是指在對(duì)象復(fù)制過(guò)程中,只復(fù)制一層變量,不會(huì)復(fù)...
    探索1者閱讀 77評(píng)論 0 0
  • 本文翻譯自 Assignment, Shallow Copy, Or Deep Copy?作者:Weilin L...
    耐心的農(nóng)夫2020閱讀 375評(píng)論 0 0
  • 在平時(shí)工作中,經(jīng)常涉及到數(shù)據(jù)的傳遞,在數(shù)據(jù)傳遞使用過(guò)程中,可能會(huì)發(fā)生數(shù)據(jù)被修改的問(wèn)題。為了防止數(shù)據(jù)被修改,就需要傳...
    秋山琳閱讀 2,420評(píng)論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂(lè)有人憂愁,有人驚喜有人失落,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,889評(píng)論 28 54

友情鏈接更多精彩內(nèi)容