Вы можете использовать любой объект в качестве ключа, если он реализует метод
Существует также одна причудливая вещь, которая может удивить вас во время отладки или модульного тестирования.
#codeexample
В CPython -1 внутренне зарезервировано для состояний ошибок, поэтому он неявно преобразуется в -2.
__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.