淺拷貝與深拷貝

0.名詞解釋

1.對象:被分配的一塊內存,存儲其所代表的值 
2.引用:是自動形成的從變量到對象的指針 
3.注意:類型(int類型,long類型(python3已去除long類型,只剩下int類型的數據))屬于對象,不是變量 
4.不可變對象:一旦創建就不可修改的對象,包括字符串、元組、數字 
5.可變對象:可以修改的對象,包括列表、字典。

1.賦值

  • python中的賦值是對象的引用,python并沒有拷貝這個對象,只是指向了被引用對象的內存地址。
a = [1,2,3]

b = a

print(id(a))
 81960592

print(id(b))
 81960592

  • a與b指向的是同一個內存地址,改變a中的值,b同樣會改變。
a = [1,2,3]

b = a

a[0] = 5

print(a)
  [5,2,3]

print(b)
  [5,2,3]

2.淺拷貝

  • 淺拷貝只會拷貝當前對象,并給予一個新內存地址,不會當前對象內的元素進行拷貝,而是直接引用當前對象的元素所指向的內存地址。

    1.第一種情況 當數據為不可變對象時:此時進行淺拷貝,拷貝得到的對象內的子元素與原對象指向不同的內存地址。

    a = [3,2,5]
    
    b = a.copy()
    
    a[0] = 6
    
    print(b)
      [3,2,5]
    
    print(a)
      [6,2,5]
    
    

    2.第二種情況 當數據為可變對象時,淺拷貝得到的新對象內的可變對象為原對象內可變對象的引用。

    a = [3,2,[1,2]]
    
    b = a.copy()
    
    a[2][0] = 4
    
    print(b)
      [3,2,[4,2]]
    
    print(a)
      [3,2,[4,2]]
    
    

3.深拷貝

  • 深拷貝是將原對象完全拷貝,新對象及其子元素均給予新的內存地址,與原對象完全無關。
b = [1,2,[2,3]]

a = copy.deepcopy(b)

b[2][0] = 4

print(a)
  [1, 2, [2, 3]]

4.特殊情況

當一個對象及其子元素全為不可變對象時,無論是深拷貝還是淺拷貝,拷貝后的對象均指向原對象的地址,即為原對象的引用。

a = (1,2,3)

b = copy.copy(a)
c = copy.deepcopy(a)

print(id(a))  #17865462
print(id(b))  #17865462
print(id(c))  #17865462
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容