Вы можете использовать любой объект в качестве ключа, если он реализует метод __hash__. Этот метод возвращает целое число, пока выполняется только одно требование: равные объекты должны иметь равные хэши (а не наоборот). Вам также следует избегать использования изменяемых объектов в качестве ключей, поскольку, когда объект становится не равным старому «я», он больше не может быть найден в словаре.

Существует также одна причудливая вещь, которая может удивить вас во время отладки или модульного тестирования.



#codeexample



: class A:

...: def _init_(self, x):

...: self.x = x

...:

...: def _hash_(self):

...: return self.x

...:

In : hash(A(2))

Out: 2

In : hash(A(1))

Out: 1

In : hash(A(0))

Out: 0

In : hash(A(-1)) # sic!

Out: -2

In : hash(A(-2))

Out: -2



В CPython -1 внутренне зарезервировано для состояний ошибок, поэтому он неявно преобразуется в -2.