Вопрос проверяет понимание работы словарей и требований к хешируемым объектам.
Объект должен быть хешируемым и неизменяемым. Для этого он обязан корректно реализовывать методы __hash__ и __eq__. Значение хеша не должно меняться в течение жизни объекта. В противном случае словарь перестаёт работать корректно.
Словарь в Python основан на хеш-таблице, поэтому ключи подчиняются строгим правилам.
Чтобы объект мог быть ключом словаря, он должен:
Реализовывать __hash__
Реализовывать __eq__
Быть логически неизменяемым
Существует жёсткое правило:
Если a == b, то hash(a) == hash(b)
Нарушение этого правила приводит к:
невозможности найти ключ
дублированию записей
логическим ошибкам
Если состояние объекта меняется после добавления в словарь:
его хеш меняется
объект «теряется» внутри словаря
Пример проблемы (концептуально):
# изменение поля объекта
# приводит к некорректному поведению dict
По умолчанию:
int, str, tuple — допустимые ключи
list, dict, set — недопустимые ключи
Для пользовательских классов:
без переопределения __eq__ используется идентичность
при переопределении __eq__ нужно явно определить __hash__
Ключ словаря должен быть хешируемым и неизменяемым. Корректная реализация __hash__ и __eq__ — обязательное условие правильной работы dict.