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

前言

我們知道列表是可變對象,指向他的變量都會根據他的變化而變化。

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

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

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

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

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

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

淺拷貝

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

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

淺拷貝意味着構造一個新的集合對象,然後用原始對象中找到的子對象的引用來填充它。從本質上講,淺層的複製只有一層的深度。我們來舉個例子。

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)不會影響l2,但第二層其實是對l1的引用,所以在嵌套列表中修改會影響l2。

深拷貝

要想拷貝對象與原對象完全沒有關係,就需要使用深拷貝,深拷貝用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]

深拷貝使複製過程遞歸。這意味着首先構造一個新的集合對象,然後遞歸地用在原始對象中找到的子對象的副本填充它。

今天的分享就到這了,我們下期再見~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章