Какой объект в Python считается хешируемым и каковы требования к нему

Ответ

Хешируемый (hashable) объект в Python — это объект, который можно использовать в качестве ключа в словаре (dict) или элемента множества (set). Главное свойство такого объекта — наличие неизменяемого хеш-значения на протяжении всего его жизненного цикла.

Основные требования к хешируемому объекту:

  1. Реализация __hash__(): Метод должен возвращать целочисленное значение (int). Для одного и того же объекта он всегда должен возвращать одинаковый хеш.
  2. Реализация __eq__(): Метод необходим для сравнения объектов. Если два объекта равны (a == b истинно), то их хеши также должны быть равны (hash(a) == hash(b)).

Почему это важно? Словари и множества используют хеш для быстрого поиска. Сначала вычисляется хеш ключа, чтобы найти нужную "корзину" (bucket), а затем используется __eq__() для поиска конкретного элемента среди всех объектов в этой корзине (в случае коллизии).

Примеры:

  • Хешируемые типы (неизменяемые): int, float, str, tuple, frozenset.
  • Нехешируемые типы (изменяемые): list, dict, set.
# Хешируемый тип (tuple)
hashable_key = (1, 'a')
my_dict = {hashable_key: 'some_value'}
print(f"Словарь с tuple-ключом: {my_dict}")

# Попытка использовать нехешируемый тип (list)
unhashable_key = [1, 'a']
try:
    another_dict = {unhashable_key: 'another_value'}
except TypeError as e:
    print(f"Ошибка: {e}")

Вывод:

Словарь с tuple-ключом: {(1, 'a'): 'some_value'}
Ошибка: unhashable type: 'list'