Ошибки при выборе ключей для defaultdict

Первые три обращения корректны. Кортеж со списком и кортеж с множеством вызывают TypeError: для ключа должны быть хешируемы все вложенные элементы.

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

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

Первые три обращения корректны. Кортеж со списком и кортеж с множеством вызывают TypeError: для ключа должны быть хешируемы все вложенные элементы.

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

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

Условие

Нужно выяснить, какие из приведённых строк выполняются без ошибок, а какие вызывают исключение, а также объяснить причины такого поведения.

from collections import defaultdict

my_dict = defaultdict(int)

assert my_dict["key"] == 0
assert my_dict[(1, 2)] == 0
assert my_dict[(1, 2, (3,))] == 0
assert my_dict[(1, 2, [3])] == 0
assert my_dict[(1, 2, {3})] == 0

Ответ

Первые три обращения корректны. Кортеж со списком и кортеж с множеством вызывают TypeError: для ключа должны быть хешируемы все вложенные элементы.

defaultdict(int) создаёт значение 0 только для отсутствующего допустимого ключа. Строка и кортежи из чисел и вложенных кортежей хешируемы, поэтому первые три assert проходят и добавляют записи.

Список [3] и множество {3} изменяемы и не имеют подходящего хеша. Их присутствие делает внешние кортежи нехешируемыми. Четвёртая строка вызывает TypeError, поэтому пятая при последовательном выполнении уже не запускается; отдельно она также вызовет TypeError.

При необходимости используйте (3,) вместо списка и frozenset({3}) вместо множества. Запуск Python с -O удаляет сами assert, включая обращения к словарю.

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

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

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

Подробнее