Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: dictionary, key

Почему ключи словаря должны быть неизменяемыми?

Вопрос проверяет понимание, как устроены словари в Python и почему для ключей важны hash и стабильность значения.

Короткий ответ

Словарь хранит элементы так, чтобы быстро находить их по ключу, используя хеш ключа. Если ключ можно менять, его хеш и сравнение могут измениться после добавления в словарь. Тогда элемент окажется “не там”, где словарь ожидает его найти, и поиск начнёт работать неправильно. Поэтому ключ должен быть неизменяемым и иметь стабильный __hash__ и корректный __eq__.

Длинный ответ

Словарь (dict) устроен как хеш-таблица: он вычисляет hash(key) и по нему выбирает место, где хранить значение.

Определение: хеш (hash) — число, которое вычисляется из объекта и используется для быстрого распределения по “корзинам” внутри словаря.

Как словарь использует ключ

Перед тем как положить пару key -> value, словарь делает следующее:

  1. Вычисляет h = hash(key).

  2. По h выбирает позицию (и при коллизиях — пробует следующие позиции).

  3. При необходимости сравнивает ключи через ==, чтобы отличать разные ключи с одинаковым хешем.

Почему изменяемый ключ ломает поиск

Если ключ изменится после вставки, обычно меняется и его хеш/сравнение:

  • словарь “помнит” старое размещение, связанное со старым hash(key);

  • поиск по обновлённому ключу пойдёт по другому пути и не найдёт элемент, либо начнёт вести себя непредсказуемо.

Мини-пример проблемы

# Список изменяемый, поэтому не может быть ключом
d = {}
# d[[1, 2]] = "x"  # TypeError: unhashable type: 'list'

Что подходит в ключи

  • Неизменяемые типы: int, str, tuple (если внутри тоже неизменяемое), frozenset.

  • Пользовательские объекты: если они “ведут себя как неизменяемые” и у них корректно определены __hash__ и __eq__.

Вывод

Ключи должны быть неизменяемыми, потому что словарь опирается на стабильные hash и сравнение ключа для корректного и быстрого поиска.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#dictionary

#key

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.