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 的父對象以及子對象:
深拷貝示例代碼執行完畢後,結果如圖所示: