Вопрос проверяет понимание требований к ключам словаря в Python, в частности, свойство неизменяемости (immutability).
Пустой кортеж () может быть ключом словаря, так как кортеж является неизменяемой структурой данных. Кортеж, содержащий пустой список ([], ), не может быть ключом. Список — это изменяемый объект, и даже будучи внутри кортежа, он делает весь кортеж непригодным для использования в качестве ключа. Попытка использовать такой кортеж вызовет ошибку TypeError.
Ключом в словаре Python может быть только хешируемый объект. Главное требование к такому объекту — его неизменяемость (immutability).
Почему один кортеж подходит, а другой — нет:
Пустой кортеж ():
Кортеж сам по себе является неизменяемой структурой. Пустой кортеж не содержит элементов, которые можно изменить.
Он успешно проходит хеширование, и Python может использовать его для однозначной идентификации записи в словаре.
Пример:
my_dict = {}
my_dict[()] = "Empty tuple" # Это сработает
print(my_dict[()]) # Выведет: Empty tupleКортеж с пустым списком ([], ):
Хотя кортеж-оболочка неизменяем, содержащийся в нем список является изменяемым объектом. Наличие изменяемого объекта внутри делает весь кортеж нехешируемым.
Python не позволяет использовать такие объекты в качестве ключей, потому что если содержимое списка изменится, его хеш-значение также изменится, что нарушит работу словаря.
Пример (который вызовет ошибку):
my_dict = {}
# my_dict[([], )] = "This will fail" # Вызовет TypeError: unhashable type: 'list'Вывод: Ключ словаря должен быть абсолютно неизменяемым. Даже вложенные элементы должны подчиняться этому правилу.