Każdy obiekt z metodą __hash__ może być kluczem słownika. Dla klas piszesz, metoda ta domyślnie powrocie wartość opiera się tożsamości (self), a jeśli równość nie jest określana przez tożsamość dla tych klas, może być zaskoczony przez używanie ich jako klucze:
>>> class A(object):
... def __eq__(self, other):
... return True
...
>>> one, two = A(), A()
>>> d = {one: "one"}
>>> one == two
True
>>> d[one]
'one'
>>> d[two]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: <__main__.A object at 0xb718836c>
>>> hash(set()) # sets cannot be dict keys
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
Zmieniono w wersji 2.6: __hash__ może teraz być ustawione na Brak, aby jawnie oznaczać instancje klasy jako nieobsługiwane. [__hash__]
class Unhashable(object):
__hash__ = None