"copy" --- 淺層 (shallow) 和深層 (deep) 複製操作
************************************************

**原始碼：**Lib/copy.py

======================================================================

Python 的賦值陳述式不複製物件，而是建立目標和物件的繫結 (binding) 關係
。對於可變 (mutable) 或包含可變項目 (mutable item) 的集合，有時會需要
一份副本來改變特定副本，而不必改變其他副本。本模組提供了通用的淺層複製
和深層複製操作（如下所述）。

介面摘要：

copy.copy(obj)

   回傳 *obj* 的淺層複製。

copy.deepcopy(obj[, memo])

   回傳 *obj* 的深層複製。

copy.replace(obj, /, **changes)

   Creates a new object of the same type as *obj*, replacing fields
   with values from *changes*.

   在 3.13 版被加入.

exception copy.Error

   引發針對特定模組的錯誤。

淺層與深層複製的區別僅與複合物件（即包含 list 或類別的實例等其他物件的
物件）相關：

* *淺層複製*建構一個新的複合物件，然後（在儘可能的範圍內）將原始物件中
  找到的物件的*參照*插入其中。

* *深層複製*建構一個新的複合物件，然後遞迴地將在原始物件裡找到的物件的
  *副本*插入其中。

深層複製操作通常存在兩個問題，而淺層複製操作並不存在這些問題：

* 遞迴物件（直接或間接包含對自身參照的複合物件）可能會導致遞迴迴圈。

* 由於深層複製會複製所有內容，因此可能會有過多複製（例如應該在副本之間
  共享的資料）。

"deepcopy()" 函式用以下方式避免了這些問題：

* 保留在目前複製過程中已複製的物件的 "memo" 字典；以及

* 允許使用者定義的類別複寫 (override) 複製操作或複製的元件集合。

該模組不複製模組、方法、堆疊追蹤（stack trace）、堆疊框（stack frame）
、檔案、socket、視窗、陣列以及任何類似的型別。它透過不變更原始物件並將
其回傳來（淺層或深層地）"複製"函式和類別；這與 "pickle" 模組處理這類問
題的方式是相似的。

字典的淺層複製可以使用 "dict.copy()"，而 list 的淺層複製可以透過賦值整
個 list 的切片 (slice) 完成，例如，"copied_list = original_list[:]"。

類別可以使用與操作 pickle 相同的介面來控制複製操作，關於這些方法的描述
資訊請參考 "pickle" 模組。實際上，"copy" 模組使用的正是從 "copyreg" 模
組中註冊的 pickle 函式。

In order for a class to define its own copy implementation, it can
define special methods "__copy__()" and "__deepcopy__()".

object.__copy__(self)

   Called to implement the shallow copy operation; no additional
   arguments are passed.

object.__deepcopy__(self, memo)

   用來實作深層複製操作；它會傳遞一個引數，即 *memo* 字典。如果
   "__deepcopy__" 實現需要建立一個元件的深層複製，它應當呼叫
   "deepcopy()" 函式並以該元件作為第一個引數、以該 *memo* 字典作為第二
   個引數。*memo* 字典應當被當作不透明物件 (opaque object) 來處理

Function "copy.replace()" is more limited than "copy()" and
"deepcopy()", and only supports named tuples created by
"namedtuple()", "dataclasses", and other classes which define method
"__replace__()".

object.__replace__(self, /, **changes)

   This method should create a new object of the same type, replacing
   fields with values from *changes*.

   在 3.13 版被加入.

也參考:

  "pickle" 模組
     支援物件之狀態檢索 (state retrieval) 和恢復 (restoration) 相關特
     殊方法的討論。
