Почему в Python ключом словаря может быть только хэшируемый объект

«Почему в Python ключом словаря может быть только хэшируемый объект» — вопрос из категории Python, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Словари в Python (dict) реализованы на основе хеш-таблиц для обеспечения очень быстрого доступа к элементам (в среднем O(1)). Работа хеш-таблицы требует, чтобы ключ был хэшируемым.

Хэшируемый объект должен удовлетворять двум условиям:

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

Изменяемые (mutable) объекты, такие как списки (list) или другие словари (dict), не могут быть ключами. Если бы значение такого объекта изменилось после добавления в словарь, его хеш также бы изменился, и объект стало бы невозможно найти.

Пример:

# Корректно: кортеж (tuple) является неизменяемым и хэшируемым
valid_key = (1, 2)
data = {valid_key: "value"}
print(data[(1, 2)])  # Вывод: value

# Ошибка: список (list) является изменяемым и нехэшируемым
invalid_key = [1, 2]
try:
    data = {invalid_key: "value"}
except TypeError as e:
    print(e)  # Вывод: unhashable type: 'list'