Какие типы данных могут быть ключами словаря в Python 3?
Объясните мне что такое хеш и для чего они нужны? В каких ситуациях используются? Буду рад если ответите четко и ясно.
Ответы (1 шт):
Словарь реализует хранение данных с помощью хэш-таблицы. (Что такое хэш-таблица) Т.е. в ней есть массив, в котором значение хэша (хэш-функция) от ключа является индексом. За счет этого, в общем случае операции добавление/удаления/поиска элемента производится за константное время О(1).
Чтобы быть ключом в словаре Python тип данных должен удовлетворять 2 требованиям:
- быть
hashable(иметь метод__hash__(), т.е. хэш-функцию) - быть сравнимым (уметь сравниваться) (иметь метод
__eq__(), т.е. иметь операцию сравнения).
Объект является хэшируемым, если у него есть хэш-значение, которое никогда не меняется в течение его времени жизни. Если хэшируемые объекты равны - это значит равны их хэш-значения. Отсюда следует вывод, что изменяемые объекты не являются хэшируемыми, т.к. при изменении объекта изменится хэш.
Большинство неизменяемых встроенных объектов Python являются хэшируемыми. Изменяемые контейнеры списки или словари - нет. Неизменяемые контейнеры кортежи и frozen-контейнеры являются хэшируемыми только в том случае, если их элементы являются хэшируемыми.
Если упрощенно, то ключами в словаре могут быть объекты, которые сравниваются не по значению, а по идентификатору. По-умолчанию объекты пользовательских классов хешируемые, т.к. они сравниваются по идентификаторам и их хэш-значение является производным от их идентификатора.
В принципе это всё написано в помощи (помощь по Python)