Ответ
Словари в Python (dict) реализованы на основе хеш-таблиц для обеспечения очень быстрого доступа к элементам (в среднем O(1)). Работа хеш-таблицы требует, чтобы ключ был хэшируемым.
Хэшируемый объект должен удовлетворять двум условиям:
- Иметь метод
__hash__(), который возвращает одно и то же целое число (хеш) на протяжении всей жизни объекта. - Иметь метод
__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'