2017-04-12 68 views
1

我掙扎deepcopy的()含有十進制值的一類。所以我嘗試了深度複製一個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 

該類複製但小數引用保持不變。

回答

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

一個十進制數是不變的。

因爲它們是不可變的,所以沒有一點在創建一個副本;無處不在,你可以使用複製,你可以放心地使用原來的,但沒有就永遠無法發散兩個完全一致的對象浪費內存。

+0

啊,謝謝!因此,對任一副本的新賦值都會創建一個新對象,而另一個引用仍將指向舊對象。 –

+1

@switch_on:包含不可變對象的可變結構仍將被複制,但只是共享對這些不可變對象的引用。您的第一個示例,即深度複製列表,會生成第二個列表對象,其值都是對另一個列表包含的完全相同整數對象的引用。 –