Qualsiasi oggetto con un metodo __hash__ può essere una chiave di dizionario. Per le classi che scrivi, questo metodo predefinito è restituire un valore in base al largo id (auto), e se l'uguaglianza non è determinata dalla identità per le classi, si può essere sorpresi utilizzandoli come tasti:
>>> 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'
Modificato nella versione 2.6: __hash__ può ora essere impostato su None per contrassegnare esplicitamente le istanze di una classe come non selezionabili. [__hash__]
class Unhashable(object):
__hash__ = None
fonte
2010-12-11 20:24:08