2017-04-12 4 views
1

10 진수 값을 포함하는 클래스를 deepcopy()하는 데 어려움을 겪고 있습니다. 그래서 Decimal 객체 자체를 깊이 복사하려고 시도했지만 실패했습니다. 내가 여기서 오해 한 것은 무엇인가?Decimal() 객체의 파이썬 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

파이썬의 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 : 변경 불가능한 객체를 포함하는 변경 가능한 구조는 여전히 복사되지만 변경 불가능한 객체에 대한 참조 만 공유합니다. 첫 번째 예제는리스트를 deep-copy하여 두 번째리스트 객체를 생성하는데, 그 값은 다른리스트에 포함 된 정확히 같은 정수 객체에 대한 참조입니다. –