Python 簡析深拷貝和淺拷貝

Python 中,將對象進行賦值的方式共有三種:

  • 直接賦值:直接將對象的引用賦值給等號左邊的對象。
  • 淺拷貝:複製一份父對象,但不會複製父對象內部子對象。
  • 深拷貝:既複製父對象,也複製子對象。

下面具體來說明。

直接賦值

>>> a = [1, 2, [1, 2]]
>>> b = a
>>> b.append(3)
>>> a;b
[1, 2, [1, 2], 3]
[1, 2, [1, 2], 3]
>>> a[2].append(3)
>>> a;b
[1, 2, [1, 2, 3], 3]
[1, 2, [1, 2, 3], 3]

可以發現,a 與 b 都指向同一個對象,如圖所示:
在這裏插入圖片描述
當給列表 b 添加元素 3 以後:
在這裏插入圖片描述
當給列表 a 中的子列表添加元素 3 後:
在這裏插入圖片描述

淺拷貝

>>> a = [1, 2, [1, 2]]
>>> b = a.copy()
>>> a.append(3)
>>> a;b
[1, 2, [1, 2], 3] # 可以發現 a 與 b 的父對象不是同一個
[1, 2, [1, 2]]
>>> a[2].append(3)
>>> a;b
[1, 2, [1, 2, 3], 3] # 可以發現 a 與 b 中的子對象爲同一個對象的引用
[1, 2, [1, 2, 3]]

淺拷貝過程如圖所示。可以發現,a 與 b 所指向的父對象是各自獨立的,但是 a 與 b 中的子對象仍爲同一個對象:
在這裏插入圖片描述
當給列表 a 添加元素 3 後:
在這裏插入圖片描述
當爲列表 a 中的子列表添加元素 3 後:
在這裏插入圖片描述

深拷貝

深拷貝需要用到 Python 自帶的 copy 模塊。

>>> import copy
>>> a = [1, 2, [1, 2]]
>>> b = copy.deepcopy(a)
>>> a;b
[1, 2, [1, 2]]
[1, 2, [1, 2]]
>>> a.append(3)
>>> a;b
[1, 2, [1, 2], 3]
[1, 2, [1, 2]]
>>> b.append(4)
>>> a;b
[1, 2, [1, 2], 3]
[1, 2, [1, 2], 4]
>>> a[2].append(3)
>>> b[2].append(4)
>>> a;b
[1, 2, [1, 2, 3], 3]
[1, 2, [1, 2, 4], 4]

深拷貝過程如圖所示,可以看到 b 完全拷貝了 a 的父對象以及子對象:
在這裏插入圖片描述
深拷貝示例代碼執行完畢後,結果如圖所示:
在這裏插入圖片描述

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