Вопрос проверяет понимание хэширования, неизменяемости объектов и того, как работают словари и множества в Python.
Хэшируемыми считаются объекты, которые имеют неизменяемое состояние и корректно реализуют методы __hash__() и __eq__(). Значение хэша должно оставаться неизменным в течение жизни объекта. Обычно хэшируемыми являются числа, строки, кортежи (если их элементы тоже хэшируемы). Изменяемые типы, такие как списки и словари, не являются хэшируемыми.
Хэшируемый объект — это объект, который можно использовать в качестве ключа словаря или элемента множества. Это означает, что Python может вычислить его хэш и использовать его для быстрого поиска.
Чтобы объект считался хэшируемым, должны выполняться условия:
Объект имеет метод __hash__(), возвращающий целое число.
Объект имеет метод __eq__().
Если два объекта равны (a == b), их хэш должен быть одинаковым.
Хэш объекта не должен изменяться во время жизни объекта.
Обычно хэшируемыми являются:
int
float
str
tuple (если все элементы хэшируемы)
frozenset
Не являются хэшируемыми:
list
dict
set
Пример:
hash("abc") # работает
hash((1, 2, 3)) # работает
hash([1, 2, 3]) # TypeError
Если объект можно изменить, его хэш может измениться, что приведёт к нарушению структуры словаря или множества.
Хэшируемость напрямую связана с неизменяемостью и корректной реализацией сравнения. Все ключи словарей должны удовлетворять этим требованиям.