Ответ
Хешируемость (hashability) — это свойство объекта, которое позволяет быстро находить его в коллекциях с доступом по ключу, таких как словари (dict
) и множества (set
).
Объект считается хешируемым, если он имеет хеш-значение, которое не меняется в течение его жизни. Это значение, вычисляемое методом __hash__()
, используется для определения, где хранить объект в памяти (в какой "корзине" хеш-таблицы).
Зачем это нужно?
Хеширование позволяет выполнять операции поиска, вставки и удаления элементов в словарях и множествах в среднем за константное время — O(1) — что делает их чрезвычайно эффективными.
Правила хешируемости:
- Объект должен реализовывать методы
__hash__()
и__eq__()
. - Главное правило: если
a == b
истинно, тоhash(a) == hash(b)
также должно быть истинно. - Хеш-значение не должно изменяться. Поэтому хешируемыми могут быть только неизменяемые (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)