Первые три обращения корректны. Кортеж со списком и кортеж с множеством вызывают TypeError: для ключа должны быть хешируемы все вложенные элементы.
Ошибки при выборе ключей для defaultdict
Первые три обращения корректны. Кортеж со списком и кортеж с множеством вызывают 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, включая обращения к словарю.