그래서 저는 몇 권의 책과 사이트를 살펴 보았습니다. 나열된 가능한 데이터 유형의 대부분은 변경 불가능합니다. 변경할 수있는 데이터 형식이 문제를 일으킬 수있는 방법을 알고 있습니다.불변의 데이터 타입을 파이썬 사전 키로 사용할 수 있습니까?
튜플이 가능한 키로 언급되었지만 튜플 요소 목록을 만들면 오류가 발생합니다. 그래서 나는 어떤 열쇠라도 그것이 불변이라면 사전에 허용 될 수 있다고 생각했습니다. 이 올바른지?
그래서 저는 몇 권의 책과 사이트를 살펴 보았습니다. 나열된 가능한 데이터 유형의 대부분은 변경 불가능합니다. 변경할 수있는 데이터 형식이 문제를 일으킬 수있는 방법을 알고 있습니다.불변의 데이터 타입을 파이썬 사전 키로 사용할 수 있습니까?
튜플이 가능한 키로 언급되었지만 튜플 요소 목록을 만들면 오류가 발생합니다. 그래서 나는 어떤 열쇠라도 그것이 불변이라면 사전에 허용 될 수 있다고 생각했습니다. 이 올바른지?
상관 객체만큼이 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
하지만 속성이 안정 해시를 떠나 평등을 결정하는 데 사용되지 않습니다 변경 데이터가 하지 평등을 결정하는 데 사용 때문에 그러나 다음 클래스는 또한 해쉬이다.