私は、pythonインタプリタが変更可能なオブジェクトに対してディープコピーを実行する際にcopy on write戦略を適用するのだろうかと思います。ディープコピーはコピーオンライトを使用しますか?
また、私はdeepcopyがnonmutableオブジェクトに対しても行われるかどうかを知りたいのですが
私は、pythonインタプリタが変更可能なオブジェクトに対してディープコピーを実行する際にcopy on write戦略を適用するのだろうかと思います。ディープコピーはコピーオンライトを使用しますか?
また、私はdeepcopyがnonmutableオブジェクトに対しても行われるかどうかを知りたいのですが
コピーオンライトは行いません。
一部のビルトイン不変型ではディープコピーを行いませんが、ユーザー定義の不変型はすべてディープコピーされます。
copy.py in the Python 2.7 standard libraryでは、マニュアルでこのメッセージが含まれています
モジュール、クラス、関数、メソッド、またスタックトレース、スタックフレーム、またファイル、ソケット、ウィンドウ、また配列のようなタイプをコピーしません。このバージョンは、同様のタイプはありません。
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
はありません、それはない、それだけコピーしたオブジェクトを行います(それはしかし、私には奇妙に思われます)。そして、もしそれらが変数を参照するならば、不変オブジェクトをコピーしなければならない。
ああ変更可能なオブジェクトを参照する不変オブジェクトについては考えていませんでした。それに対して+1。また、2つのモジュールオブジェクトのディープコピーを発行すると、関数オブジェクトもコピーされます(つまり、メモリ内に同じ機能のインスタンスが2つあります)。 – Emiliano
@happy_emi:関数はコピーされません。 'deepcopy(deepcopy)is deepcopy'を試してください。 –
見てみましょう:x
とy
の最初の要素について
>>> 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
、コピーが行われたオブジェクトは、新しいIDを持っています。 3番目の要素(不変の文字列)はコピーされません。
+1そのリンクを提供しています。行41-43は、何がコピーされ、何がコピーされていないかを明確に述べている。 – Emiliano
私のテストによれば、 '(1、[2,3]) 'はコピーされますが、'(1、(2,3)) 'はコピーされません。したがって、明らかに、コンテナと同様に、含まれている型を調べます。 – interjay
@happy Ha、私は気付かなかった。私は答えにそれを含めるべきです。 –