Чтобы объект можно было использовать в качестве ключа словаря, он должен быть хешируемым. Хешируемые объекты поддерживают метод __hash__
, который возвращает целое число. Для получения хеша значения используется встроенная функция hash
.
Встроенные типы, которые являются неизменяемыми, по умолчанию хешируемы. Все пользовательские объекты тоже хешируемы, но есть нюанс. Если вы определяете метод __eq__
для своего типа, то вы также должны определить __hash__
таким образом, чтобы hash(a) == hash(b)
для всех a
и b
, которые считаются равными. Нарушение этого правила может привести к некорректной работе словаря:
class A:
def __init__(self, x):
self.x = x
def __hash__(self):
return random.randrange(10000)
def __eq__(self, other):
return self.x == other.x
d = {}
d[A(2)] = 2
d.get(A(2), 0)
# Вывод: 0
Обратите внимание: как только вы определяете
__eq__
в классе, реализация __hash__
по умолчанию удаляется, так как она больше не подходит (по умолчанию все значения считаются неравными).👉@BookPython
>>Click here to continue<<