5

可変オブジェクトでディープコピーを実行するときに、Pythonインタープリターがコピーオンライト戦略を適用するのではないかと思います。

また、変更不可能なオブジェクトに対してもディープコピーが実行されるかどうかを知りたいです(ただし、それは私には奇妙に思えます)

4

3 に答える 3

6

コピーオンライトは行いません。

一部の組み込みの不変タイプではディープコピーを実行しませんが、ユーザー定義の「不変」タイプはディープコピーされます。

Python 2.7標準ライブラリのcopy.pyには、ドキュメントに次のメッセージが含まれています。

このバージョンでは、モジュール、クラス、関数、メソッド、スタックトレース、スタックフレーム、ファイル、ソケット、ウィンドウ、配列などのタイプや、同様のタイプはコピーされません。

copy次のような不変オブジェクトを処理します。

def _copy_immutable(x):
    return x
for t in (type(None), int, long, float, bool, str, tuple,
          frozenset, type, xrange, types.ClassType,
          types.BuiltinFunctionType, type(Ellipsis),
          types.FunctionType, weakref.ref):
    d[t] = _copy_immutable
for name in ("ComplexType", "UnicodeType", "CodeType"):
    t = getattr(types, name, None)
    if t is not None:
        d[t] = _copy_immutable

deepcopyこれにコピーするには長すぎる、より複雑なスキームを使用しますが、要点は同じです。興味深い点の1つは、要素を_deepcopy_tuple繰り返し処理し、コピーされた要素が見つかるまで新しいオブジェクトを作成しないことです。

for i in range(len(x)):
    if x[i] is not y[i]:
        y = tuple(y)
        break
else:
    y = x
于 2011-07-25T16:57:49.927 に答える
4

いいえ、そうではありません。オブジェクトをコピーするだけです。また、不変オブジェクトが可変を参照している場合は、それらをコピーする必要があります。

于 2011-07-25T16:53:58.457 に答える
3

どれどれ:

>>> import copy
>>> x = [[1],[2],"abc"]
>>> y = copy.deepcopy(x)
>>> id(x[0])
4299612960
>>> id(y[0])
4299541608
>>> id(x[2])
4297774504
>>> id(y[2])
4297774504

xおよびの最初の要素に対してy、コピーが実行され、オブジェクトは新しいIDを持ちます。3番目の要素である不変の文字列はコピーされません。

于 2011-07-25T16:56:43.457 に答える