Вопрос проверяет понимание фундаментальных свойств кортежей в Python, их отличий от списков и практического применения в качестве ключей словаря.
Кортеж (tuple) в Python — это встроенная неизменяемая (immutable) коллекция. Неизменяемость означает, что после создания кортежа вы не можете изменить его содержимое: добавить, удалить или заменить элементы. Это фундаментальное отличие от списка (list), который является изменяемым.
Неизменяемость кортежа заложена в дизайн языка Python. Это обеспечивает несколько преимуществ:
Словарь (dict) в Python реализован как хеш-таблица. Для быстрого доступа к значению по ключу Python вычисляет хеш-код ключа. Этот хеш должен быть постоянным на протяжении всего времени жизни объекта. Если объект изменяется (как список), его хеш тоже может измениться, что нарушит работу словаря — ключ станет невозможно найти.
Поскольку кортеж неизменяем, его хеш-код, вычисляемый с помощью встроенной функции hash(), остаётся постоянным. Это делает кортеж хешируемым и, следовательно, пригодным для роли ключа.
Кортежи часто используют для создания составных ключей. Рассмотрим практический пример — кэширование результатов функции для координат (x, y):
# Кэш для хранения вычисленных значений
cache = {}
def compute_value(x, y):
# Используем кортеж (x, y) как ключ
key = (x, y)
if key in cache:
return cache[key]
# Дорогостоящее вычисление
result = x * x + y * y
cache[key] = result
return result
print(compute_value(2, 3)) # Вычисляет и сохраняет (2, 3) -> 13
print(compute_value(2, 3)) # Берёт из кэша по ключу (2, 3)
# Попытка использовать список как ключ вызовет ошибку:
# bad_key = [2, 3]
# cache[bad_key] = 5 # TypeError: unhashable type: 'list'Не каждый кортеж автоматически хешируем. Если кортеж содержит внутри себя изменяемые элементы (например, списки), он тоже становится нехешируемым:
# Этот кортеж НЕ может быть ключом словаря
problematic_tuple = (1, 2, [3, 4])
# hash(problematic_tuple) # Вызовет TypeErrorХешируемость зависит от хешируемости всех элементов кортежа.
Вывод: Используйте кортеж как ключ словаря, когда вам нужен составной, неизменяемый идентификатор. Это идеально для координат, точек во времени, составных ID или любых данных, которые логически представляют собой единое, постоянное значение.