ソースコード:Lib/copy.py

Pythonの代入文はオブジェクトをコピーせず、ターゲットとオブジェクトの間にバインディングを作成します。 可変またはcontainmutableアイテムであるコレクションの場合、一方が他方を変更せずに一方のコピーを変更できるように、コピーが必要になることがあります。 このモジュールは、一般的な浅いコピー操作と深いコピー操作を提供します(後述)。

インターフェイスの概要:

copy.copy(x)¶

xの浅いコピーを返します。,

copy.deepcopy(x)≤

xの詳細コピーを返します。

例外copy.error

モジュール固有のエラーのために発生しました。

浅いコピーと深いコピーの違いは、compoundobjects(リストやクラスインスタンスなどの他のオブジェクトを含むオブジェクト)にのみ関連します。

  • 浅いコピーは、新しい複合オブジェクトを構築し、(可能な限り)元のオブジェクトに参照を挿入します。,

  • ディープコピーは、新しい複合オブジェクトを構築し、再帰的に、元のオブジェクトに見つかったオブジェクトをinsertscopiesします。

再帰オブジェクト(直接または間接的に、自分自身への参照を含む複合オブジェクト)は、再帰的なループを引き起こす可能性があります。

  • ディープコピーはすべてをコピーするため、コピー間で共有されることを意図したデータなど、コピーが多すぎる可能性があります。,

  • deepcopy()関数は、

    • memocurrentcopyingパス中にすでにコピーされたオブジェクトの辞書を保持し、

    • ユーザー定義クラスにコピー操作またはコピーされたコンポーネントのセットをオーバーライドさせることによって、これらの問題を回避します。

    このモジュールは、モジュール、メソッド、スタックトレース、スタックフレーム、ファイル、ソケット、ウィンドウ、配列、または類似の型のような型をコピーしません。, これは、これらがpickleモジュールによって処理される方法と互換性があります。

    クラスは、controlpicklingに使用するのと同じインターフェイスを使用してコピーを制御できます。 これらのソッドについては、モジュールpickleの説明を参照してください。 実際、copyモジュールは、copyregモジュールのregisteredpickle関数を使用します。,クラスが独自のコピー実装を定義するには、特別なメソッド__copy__()および__deepcopy__()を定義できます。 前者は、浅いコピー操作を実装するために呼び出され、追加の引数は渡されません。後者は、ディープコピー操作を実装するために呼び出されます。oneargument、memo辞書に渡されます。, __deepcopy__()実装がコンポーネントの詳細なコピーを作成する必要がある場合は、deepcopy()関数を呼び出す必要がありますコンポーネントを第一引数とし、メモ辞書を第二引数とします。

    も参照してください

    モジュールpickle

    オブジェクト状態の取得と復元をサポートするために使用される特別なメソッドについて説明します。