2016-08-29 2 views
0

그래서 저는 몇 권의 책과 사이트를 살펴 보았습니다. 나열된 가능한 데이터 유형의 대부분은 변경 불가능합니다. 변경할 수있는 데이터 형식이 문제를 일으킬 수있는 방법을 알고 있습니다.불변의 데이터 타입을 파이썬 사전 키로 사용할 수 있습니까?

튜플이 가능한 키로 언급되었지만 튜플 요소 목록을 만들면 오류가 발생합니다. 그래서 나는 어떤 열쇠라도 그것이 불변이라면 사전에 허용 될 수 있다고 생각했습니다. 이 올바른지?

답변

7

상관 객체만큼이 hashable 같이, 키로서 사용될 수있다 :

그것의 수명 동안 변경되지 않을 해시 값을 가지면 목적은 해쉬된다 (그것은 __hash__() 방법이 필요) 다른 객체와 비교할 수 있습니다 (__eq__() 또는 __cmp__() 메소드 필요). equal을 비교하는 해시 가능 객체는 동일한 해시 값을 가져야합니다.

불변성을 사용하면 안정적인 해시를 생성 할 수 있지만 해시를 생성하는 데 사용되는 상태를 변경하지 않는 한 변경할 수있는 사용자 지정 클래스는 좋습니다.

튜플은 해시 가능 객체 만 포함하는 경우에만 해시 가능합니다. 튜플의 해시는 내용의 해시에 의해 결정됩니다. 두 튜플이 동일한 지 여부를 결정하기 때문입니다. 당신은 예를 들어, 목록이 포함 된 튜플을 해시 할 수 없습니다

>>> l = ['foo', 'bar'] 
>>> t = (42, l) # contains a list 
>>> hash(t) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

목록이 해쉬 아니라,이 두 개의리스트를 결정하는 내용을 사용하기 때문에 너무 (내용에서 해시를 구축해야하기 때문 같음), 목록에있는 내용을 쉽게 변경할 수 있기 때문에 해시가 목록 수명 동안 변경됩니다.

해시가 두 개체를 동일하게 만드는 동일한 변수를 기반으로하는 경우 사용자 지정 클래스를 키로 사용할 수 있습니다. 사용자 정의 클래스에 대한 기본 구현은 정확히 동일한 인스턴스 인 경우 두 개의 인스턴스가 같아야 만 기본적으로 해시 가능하게 만듭니다.

class HashableDemo(object): 
    def __init__(self, value): 
     self._value = value 
     self._count = 0 

    def increment(self): 
     self._count += 1 

    def __eq__(self, other): 
     if not isinstance(other, HashableDemo): 
      return False 
     return self._value == other._value 

    def __hash__(self): 
     return hash(self._value) 

클래스 변이 _count하지만 속성이 안정 해시를 떠나 평등을 결정하는 데 사용되지 않습니다 변경 데이터가 하지 평등을 결정하는 데 사용 때문에 그러나 다음 클래스는 또한 해쉬이다.

관련 문제