このモジュールでは汎用の (浅い/深い) コピー操作を提供しています。
以下にインタフェースをまとめます:
import copy x = copy.copy(y) # make a shallow copy of y x = copy.deepcopy(y) # make a deep copy of y
浅い (shallow) コピーと深い (deep) コピーの違いが関係するのは、 複合オブジェクト (リストやクラスインスタンスのような他のオブジェクトを 含むオブジェクト) だけです:
深いコピー操作には、しばしば浅いコピー操作の時には存在しない 2 つの 問題がついてまわります:
deepcopy() 関数では、これらの問題を以下のようにして 回避しています:
このモジュールでは、モジュール、メソッド、スタックトレース、 スタックフレーム、ファイル、ソケット、ウィンドウ、アレイ、その他これらに 類似の型をコピーしません。 このモジュールでは元のオブジェクトを変更せずに返すことで関数とクラスを (浅く または 深く)「コピー」します。これは pickleモジュールでの 扱われかたと同じです。 バージョン 2.5 で 変更 された仕様: 関数コピーの追加
クラスでは、pickle 化を制御するためのインタフェースと同じインタフェースを コピーの制御に使うことができます。これらのメソッドに関する情報は pickle モジュールの記述を 参照してください。copy モジュールは pickle 用関数登録モジュール copy_reg を使いません。
クラス独自のコピー実装を定義するために、特殊メソッド __copy__() および __deepcopy__() を定義することができます。前者は 浅いコピー操作を実装するために使われます; 追加の引数はありません。 後者は深いコピー操作を実現するために呼び出されます; この関数には 単一の引数としてメモ辞書が渡されます。__deepcopy__() の実装で、内容のオブジェクトに対して深いコピーを生成する必要がある場合、 deepcopy() を呼び出し、最初の引数にそのオブジェクトを、 メモ辞書を二つ目の引数に与えなければなりません。
参考: