Чтобы использовать объект как ключ словаря, он должен быть хешируемым.
Хешируемый объект должен удовлетворять двум условиям:
__hash__, который возвращает согласованное целое значение хеша на протяжении всего своего существования__eq__, чтобы Python мог разрешать коллизии хешей, сравнивая ключи на равенствоОсновной принцип: если два объекта равны, они должны давать одинаковое значение хеша.
Объекты должны быть неизменяемыми, чтобы быть надёжно хешируемыми. Если данные объекта изменятся после использования его в качестве ключа, его значение хеша тоже изменится, что сделает невозможным его поиск в словаре.
Хешируемые (допустимые ключи):
str, int, float, booltuple — только если все её элементы тоже хешируемыfrozensetНе хешируемые (недопустимые ключи):
list — изменяемый, нет __hash__dict — изменяемый, нет __hash__set — изменяемый, нет __hash__Пользовательские классы хешируемы по умолчанию, так как они наследуют __hash__ из object. Однако если ты определишь __eq__ без определения __hash__, Python автоматически установит __hash__ в None, сделав экземпляры нехешируемыми:
class MyClass:
def __eq__(self, other):
return True
# __hash__ теперь None — экземпляры нельзя использовать как ключи
Объект можно использовать как ключ словаря, если он реализует методы __hash__ и __eq__, и если два объекта равны согласно __eq__, они должны давать одинаковые значения хеша.
Новый — ещё не проверен сообществом
Вы