Любой объект с методом __ hash __ может быть ключом словаря.Для классов, которые вы пишете, этот метод по умолчанию возвращает значение, основанное на id (self), и если равенство не определяется идентичностью для этих классов, вы можете быть удивлены использованием их в качестве ключей:
>>> 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'
Изменено в версии 2.6: теперь __hash__ может быть установлен в None, чтобы явно помечать экземпляры класса как не подлежащие обработке. [ __ hash __ ]
class Unhashable(object):
__hash__ = None