深淺拷貝的區別


深淺拷貝的區別

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()得到的一個拷貝對象,被拷貝對象的的子元素發送變化后,並不影響拷貝對象的值,反之亦然。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM