Контекст: Python, словари и ключи ключ словаря обязан быть хешируемым (immutable) пустой кортеж () неизменяем и хешируем, поэтому подходит для ключа кортеж с пустым списком ( []) содержит мутабельный элемент и сам не является хешируемым кортеж с изменяемым содержимым нельзя использовать как ключ — возникнет TypeError следовательно, пустой кортеж допустим, а кортеж с пустым списком — нет На практике ключи следует составлять только из иммутабельных типов: кортежей с неизменяемыми элементами, строк и чисел Итог: сами кортежи различаются, но второй непригоден для словаря из-за содержащегося в нём списка
Могут ли пустой кортеж и кортеж с пустым списком быть ключами?
Контекст: Python, словари и ключи ключ словаря обязан быть хешируемым (immutable) пустой кортеж () неизменяем и хешируем, поэтому подходит для ключа кортеж с пустым списком ( []) содержит мутабельный элемент и сам не…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Могут ли пустой кортеж и кортеж с пустым списком быть ключами?
- Контекст: Python, словари и ключи
- ключ словаря обязан быть хешируемым (immutable)
- пустой кортеж
()неизменяем и хешируем, поэтому подходит для ключа - кортеж с пустым списком
( [])содержит мутабельный элемент и сам не является хешируемым - кортеж с изменяемым содержимым нельзя использовать как ключ — возникнет
TypeError - следовательно, пустой кортеж допустим, а кортеж с пустым списком — нет
- На практике ключи следует составлять только из иммутабельных типов: кортежей с неизменяемыми элементами, строк и чисел
- Итог: сами кортежи различаются, но второй непригоден для словаря из-за содержащегося в нём списка
Иными словами, первый кортеж может быть ключом Python, а второй — нет, поскольку его содержимое не хешируется.
Подробный ответ
Основной ответ
В Python кортеж допустимо использовать как ключ словаря только в том случае, если он хэшируем. Пустой кортеж () неизменяем и хешируем, поэтому подходит для этой роли. Вариант с пустым списком, например ([],), ключом быть не может: список изменяем и потому является нехэшируемым. Попытка использовать такой кортеж в словаре вызовет исключение TypeError: unhashable type: 'list'.
Ключевые моменты
- Пустой кортеж
()— immutable, hashable; его разрешено использовать в качестве ключа словаря. - Кортеж с пустым списком
( [], )содержит mutable-объект, из-за чего весь кортеж становится нехэшируемым и не может выступать ключом. - Ключ словаря должен быть хэшируемым и неизменяемым. Поэтому одного факта неизменяемости контейнера недостаточно: изменяемый объект внутри кортежа нарушает это требование.
Практический контекст
В приложениях кортежи часто служат составными ключами, например (user_id, date), если все их элементы неизменяемы. Mutable-значения внутри кортежа могут вызвать ошибку уже при добавлении в словарь или сложные ошибки при изменении данных после вставки. Поэтому типы всех элементов кортежа-ключа нужно контролировать заранее.