Какие типы данных могут быть ключами словаря в Python 3?

Объясните мне что такое хеш и для чего они нужны? В каких ситуациях используются? Буду рад если ответите четко и ясно.


Ответы (1 шт):

Автор решения: DmitryK

Словарь реализует хранение данных с помощью хэш-таблицы. (Что такое хэш-таблица) Т.е. в ней есть массив, в котором значение хэша (хэш-функция) от ключа является индексом. За счет этого, в общем случае операции добавление/удаления/поиска элемента производится за константное время О(1).
Чтобы быть ключом в словаре Python тип данных должен удовлетворять 2 требованиям:

  • быть hashable (иметь метод __hash__(), т.е. хэш-функцию)
  • быть сравнимым (уметь сравниваться) (иметь метод __eq__(), т.е. иметь операцию сравнения).

Объект является хэшируемым, если у него есть хэш-значение, которое никогда не меняется в течение его времени жизни. Если хэшируемые объекты равны - это значит равны их хэш-значения. Отсюда следует вывод, что изменяемые объекты не являются хэшируемыми, т.к. при изменении объекта изменится хэш.
Большинство неизменяемых встроенных объектов Python являются хэшируемыми. Изменяемые контейнеры списки или словари - нет. Неизменяемые контейнеры кортежи и frozen-контейнеры являются хэшируемыми только в том случае, если их элементы являются хэшируемыми.
Если упрощенно, то ключами в словаре могут быть объекты, которые сравниваются не по значению, а по идентификатору. По-умолчанию объекты пользовательских классов хешируемые, т.к. они сравниваются по идентификаторам и их хэш-значение является производным от их идентификатора. В принципе это всё написано в помощи (помощь по Python)

→ Ссылка