2017-04-12 4 views
1

Decimal値を含むクラスをdeepcopy()しようとしています。そこで私はDecimalオブジェクトを深くコピーしようとしましたが、それも失敗しました。私はここで何を誤解していますか?Decimal()オブジェクトのPython deepcopy()

from copy import deepcopy 
from decimal import Decimal 

## Deepcopy an array ## 
a = [1,2,3,4] 
b = deepcopy(a) 
a is b 
# False 

## Deep copy a Decimal ## 
a = Decimal('0.123') 
b = deepcopy(a) 
a is b 
# True 

## Deepcopy a class containing a Decimal ## 
class A(object): 
    def __init__(self, dec): 
     self.myDecimal = Decimal(dec) 

a = A('0.123') 
b = deepcopy(a) 
a is b 
# False 

a.myDecimal is b.myDecimal 
# True 

クラスはコピーされますが、10進数の参照は同じままです。

答えて

6

Pythonのcopyモジュールでは、不変オブジェクトのコピーが生成されません。これは非常に非効率的です。 decimal.Decimal()オブジェクトは不変ですので、彼らは単にコピー操作のためのselfを返す:

>>> from decimal import Decimal 
>>> d = Decimal() 
>>> d.__copy__() is d 
True 
>>> d.__deepcopy__({}) is d 
True 

decimal module documentationを参照してください:

進数は不変です。

これは不変なので、コピーの作成にはのポイントはありません。コピーを使用できる場所であれば、オリジナルのも安全に使用できますが、決して発散しない2つの完全に同一のオブジェクトにメモリを浪費することはありません。

+0

ああ、ありがとう!したがって、いずれかのコピーへの新しい割り当てによって新しいオブジェクトが作成され、もう一方の参照は引き続き古いオブジェクトを指し示します。 –

+1

@switch_on:不変オブジェクトを含む変更可能な構造体はコピーされますが、それらの不変オブジェクトへの参照を共有するだけです。最初の例では、リストを深くコピーすると、値がすべて他のリストに含まれているものとまったく同じ整数オブジェクトへの参照である2番目のリストオブジェクトが生成されます。 –