Для чего нужна хешируемость объектов в Python

Ответ

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

Объект считается хешируемым, если он имеет хеш-значение, которое не меняется в течение его жизни. Это значение, вычисляемое методом __hash__(), используется для определения, где хранить объект в памяти (в какой "корзине" хеш-таблицы).

Зачем это нужно?

Хеширование позволяет выполнять операции поиска, вставки и удаления элементов в словарях и множествах в среднем за константное время — O(1) — что делает их чрезвычайно эффективными.

Правила хешируемости:

  1. Объект должен реализовывать методы __hash__() и __eq__().
  2. Главное правило: если a == b истинно, то hash(a) == hash(b) также должно быть истинно.
  3. Хеш-значение не должно изменяться. Поэтому хешируемыми могут быть только неизменяемые (immutable) объекты.

Примеры:

Встроенные неизменяемые типы (int, str, tuple, frozenset) являются хешируемыми по умолчанию:

# Корректное использование
my_dict = { "key": 1, 123: 2, (1, 2): 3 }
my_set = { "a", "b", "c" }

Изменяемые типы (list, dict, set) не являются хешируемыми, так как их содержимое (и, следовательно, хеш) может измениться. Попытка их использования вызовет ошибку TypeError:

# Этот код вызовет TypeError: unhashable type: 'list'
try:
    my_dict = { [1, 2]: "value" }
except TypeError as e:
    print(e)