可変オブジェクトでディープコピーを実行するときに、Pythonインタープリターがコピーオンライト戦略を適用するのではないかと思います。
また、変更不可能なオブジェクトに対してもディープコピーが実行されるかどうかを知りたいです(ただし、それは私には奇妙に思えます)
可変オブジェクトでディープコピーを実行するときに、Pythonインタープリターがコピーオンライト戦略を適用するのではないかと思います。
また、変更不可能なオブジェクトに対してもディープコピーが実行されるかどうかを知りたいです(ただし、それは私には奇妙に思えます)
コピーオンライトは行いません。
一部の組み込みの不変タイプではディープコピーを実行しませんが、ユーザー定義の「不変」タイプはディープコピーされます。
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
いいえ、そうではありません。オブジェクトをコピーするだけです。また、不変オブジェクトが可変を参照している場合は、それらをコピーする必要があります。
どれどれ:
>>> 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番目の要素である不変の文字列はコピーされません。