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