
前言
我們知道列表是可變對(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)~