Cualquier objeto con un método __hash__ puede ser una clave de diccionario. Para las clases que escribe, este método por defecto es devolver un valor basan fuera Identificación del (auto), y si la igualdad no está determinada por la identidad de esas clases, puede que se sorprenda al utilizarlos como claves:
>>> 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'
Se modificó en la versión 2.6: __hash__ ahora puede establecerse en None para indicar explícitamente que las instancias de una clase son inigualables. [__hash__]
class Unhashable(object):
__hash__ = None