Почему в Python нельзя использовать список в качестве ключа словаря, но можно использовать кортеж (tuple)?

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

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

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Например, (1, "a") можно использовать ключом, а ([1, 2], "a") нельзя: внутри кортежа находится список. Неизменяемость самого контейнера не делает автоматически хешируемым его содержимое. Если бы менялся hash уже сохранённого ключа, словарь мог бы искать его не в той корзине. Для множества значений как ключа подойдёт frozenset, если порядок не важен и его элементы тоже хешируемы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее