2011-07-25 10 views

答えて

5

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

一部のビルトイン不変型ではディープコピーを行いませんが、ユーザー定義の不変型はすべてディープコピーされます。

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 
+0

+1そのリンクを提供しています。行41-43は、何がコピーされ、何がコピーされていないかを明確に述べている。 – Emiliano

+2

私のテストによれば、 '(1、[2,3]) 'はコピーされますが、'(1、(2,3)) 'はコピーされません。したがって、明らかに、コンテナと同様に、含まれている型を調べます。 – interjay

+0

@happy Ha、私は気付かなかった。私は答えにそれを含めるべきです。 –

4

はありません、それはない、それだけコピーしたオブジェクトを行います(それはしかし、私には奇妙に思われます)。そして、もしそれらが変数を参照するならば、不変オブジェクトをコピーしなければならない。

+1

ああ変更可能なオブジェクトを参照する不変オブジェクトについては考えていませんでした。それに対して+1。また、2つのモジュールオブジェクトのディープコピーを発行すると、関数オブジェクトもコピーされます(つまり、メモリ内に同じ機能のインスタンスが2つあります)。 – Emiliano

+1

@happy_emi:関数はコピーされません。 'deepcopy(deepcopy)is deepcopy'を試してください。 –

3

見てみましょう:xyの最初の要素について

>>> 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番目の要素(不変の文字列)はコピーされません。

関連する問題