深入理解python中的賦值、深拷貝、淺拷貝(基礎篇十六)

一 賦值、淺拷貝、深拷貝

1 賦值

對象之間賦值本質上 是對象之間的引用傳遞而已。也就是多個對象指向同一個數據空間。

2 淺拷貝

淺拷貝是對一個對象的頂層數據的拷貝

說明:

如果 如圖,C對象的頂層數據就是[a,b],所以通過淺拷貝給D對象時D對象中也是[a,b]。這如同東施效顰一樣,只能看到一個西施的外在並進行復制,而不能去複製更深處的氣質。

在這裏插入圖片描述
在這裏插入圖片描述

3 深拷貝

深拷貝是對於一個對象所有層次的拷貝(遞歸)

進一步理解深拷貝

4 拷貝注意點

<1> 拷貝的其他方式

  • 分片表達式可以複製一個序列
  • 字典的copy方法可以拷貝一個字典

    通過效果驗證可以得出結論就是以上兩種複製方式屬於淺拷貝

拋出問題: 爲什麼Python中大多數都是淺拷貝呢?

  • 時間角度,淺拷貝花費時間更少
  • 空間角度,淺拷貝花費內存更少
  • 效率角度,淺拷貝只拷貝頂層數據,一般情況下比深拷貝效率高。

<2> copy和deepcopy

淺拷貝對不可變類型和可變類型的copy不同

  1. copy.copy對於可變類型,會進行淺拷貝
  2. copy.copy和copy.deepcopy對於不可變類型沒有意義,全部等價於對象之間的賦值操作。
In [88]: a = [11,22,33]
In [89]: b = copy.copy(a)
In [90]: id(a)
Out[90]: 59275144
In [91]: id(b)
Out[91]: 59525600
In [92]: a.append(44)
In [93]: a
Out[93]: [11, 22, 33, 44]
In [94]: b
Out[94]: [11, 22, 33]


In [95]: a = (11,22,33)
In [96]: b = copy.copy(a)
In [97]: id(a)
Out[97]: 58890680
In [98]: id(b)
Out[98]: 58890680


copy.copy和copy.deepcopy的區別

  • copy.copy

  • copy.deepcopy


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