Вопрос проверяет понимание того, как Python использует хеширование и сравнение объектов при работе со словарями и множествами.
Метод __hash__ возвращает хеш объекта и используется для определения позиции в hash-map. Метод __eq__ определяет, равны ли два объекта. При использовании объекта как ключа сначала сравниваются хеши, затем при необходимости вызывается __eq__. Если эти методы реализованы некорректно, словари и множества могут работать неправильно.
__hash__ и __eq__Когда объект используется как ключ словаря, Python выполняет два шага:
Вычисляет хеш через __hash__
При совпадении хеша проверяет равенство через __eq__
Это нужно для корректной обработки коллизий.
Важно правило:
Если два объекта равны (__eq__ возвращает True), их хеш должен быть одинаковым.
Иначе словарь будет вести себя некорректно.
class User:
def __init__(self, id):
self.id = id
def __eq__(self, other):
return isinstance(other, User) and self.id == other.id
def __hash__(self):
return hash(self.id)
Теперь такие объекты можно использовать как ключи.
Если объект изменится после вставки в словарь:
хеш может измениться
ключ станет недоступным
Поэтому ключи должны быть неизменяемыми.
dict
set
кэширование
индексация объектов
__hash__ отвечает за размещение в hash-map, __eq__ — за проверку равенства; они должны быть согласованы.