Как ответить
Нет, ключ словаря не может быть изменяемым объектом. В 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__ грамотно, можно создать изменяемый объект, который технически будет ключом — но это плохая практика. Хеш такого объекта не должен меняться, даже если его поля изменились.
- На практике: большинство разработчиков используют строки, числа и кортежи из неизменяемых элементов.