深淺拷貝的區別
1.賦值運算
l1 = [1,2,3,['tank','nick']]
l2 = l1
l1[0] = 111
print(l1) # [111, 2, 3, ['tank', 'nick']]
print(l2) # [111, 2, 3, ['tank', 'nick']]
l1[3][0] = 'kevin'
print(l1) # [111, 2, 3, ['kevin', 'nick']]
print(l2) # [111, 2, 3, ['kevin', 'nick']]
對於賦值運算的 l1 和l2 指向同一個內存地址 ,所以是完全一樣的。數據共用。
深淺拷貝針對的是可變類型的數據,對於不可變類型的數據,無論深淺拷貝,數據都是共用的,只要一個拷貝的值發生改變,另外一個不會受影響,沒有任何的意義。
2.淺拷貝
l1 = [1,'tank',(1,2,3),[22,23]]
l2 = l1.copy()
l1[-1][1] = 10
print(l1) #[1, 'tank', (1, 2, 3), [22, 10]]
print(l2) #[1, 'tank', (1, 2, 3), [22, 10]]
print(id(l1[1])) #2405832388824
print(id(l2[1])) #2405832388824
print(id(l1)) #2526331895048
print(id(l2)) #2526331994696
print(id(l1[3])) #2526331894856
print(id(l2[3])) #2526331894856
print(id(l1[0])) #1505198192
print(id(l2[0])) #1505198192
對於淺拷貝,只是內存空間重新開辟了一塊名稱空間,但是被拷貝對象中的數據(無論可變還是不可變類型數據)都是共用的。對於拷貝對象的子元素是可變類型的,通過copy()或賦值得到的一個拷貝對象,被拷貝對象的子元素的值發送變化后,拷貝對象的值亦隨之發生變化,反之亦然。
3.深拷貝
import copy
l1 = [1,'tank',(1,2,3),[22,23]]
l2 = copy.deepcopy(l1)
l1[-1][1] = 10
print(id(l1[1]))#2544575770840
print(id(l2[1]))#2544575770840
print(l1)#[1, 'tank', (1, 2, 3), [22, 10]]
print(l2)#[1, 'tank', (1, 2, 3), [22, 23]]
print(id(l1))#2544576199944
print(id(l2))#2544576299592
print(id(l1[3]))#2544576199752
print(id(l2[3]))#2544576299528
print(id(l1[0]))#1505198192
print(id(l2[0])) # 1505198192
對於深拷貝,內存空間中重新開辟一塊新的名稱空間,但是對於被拷貝對象中的可變類型的數據是重新創建的。通過deepcopy()得到的一個拷貝對象,被拷貝對象的的子元素發送變化后,並不影響拷貝對象的值,反之亦然。