ENIGMA AI
ENIGMA AI

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

встречается 1× Python junior language_specific

Как ответить

Нет, ключ словаря не может быть изменяемым объектом. В Python ключами словаря могут быть только хешируемые объекты — то есть объекты, которые имеют неизменный хеш на протяжении своей жизни. Если ключ изменится, хеш-таблица словаря сломается: мы не сможем найти элемент по старому хешу.

Изменяемые объекты — списки, множества, словари — не могут быть ключами, потому что их хеш нестабилен. Попробуй использовать список как ключ — получишь TypeError:

d = {[1, 2]: 'value'}
# TypeError: unhashable type: 'list'

Кортежи — интересный случай. Если кортеж содержит только неизменяемые элементы (числа, строки, другие кортежи), он хешируем и может быть ключом. Но если в кортеже есть изменяемый объект (например, список), такой кортеж не хешируется:

key_ok = (1, 'a')
d = {key_ok: 'ok'}  # работает

key_bad = (1, [2, 3])
d = {key_bad: 'fail'}  # TypeError: unhashable type: 'list'

Ещё один нюанс: числа с плавающей точкой — хешируемые, но их хеши не всегда логичны из-за внутреннего представления float. Практически не используй float как ключ.

  • Главный принцип: если объект можно изменить после создания (list, dict, set) — он не может быть ключом.
  • Исключение: пользовательские классы. Если переопределить методы __hash__ и __eq__ грамотно, можно создать изменяемый объект, который технически будет ключом — но это плохая практика. Хеш такого объекта не должен меняться, даже если его поля изменились.
  • На практике: большинство разработчиков используют строки, числа и кортежи из неизменяемых элементов.

Ключевые тезисы

  • Ключи должны быть хешируемыми — иметь стабильный хеш на всё время жизни объекта.
  • Изменяемые типы (list, dict, set) не хешируются — не могут быть ключами.
  • Кортежи хешируются только если все их элементы тоже хешируемы.
  • Пользовательские классы могут быть ключами, если корректно реализованы __hash__ и __eq__, но это редкий кейс.
  • Float как ключ — технически можно, но лучше избегать из-за NaN и точности.

Что спросят дальше

  • — Что произойдёт с хешем, если изменить элемент кортежа, который является ключом?
  • — Почему строки и числа — хорошие ключи, а float — плохой?
  • — Как работает хеширование для пользовательского класса, который ты хочешь сделать ключом?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение