Кортеж — это список, который нельзя менять
Кортежи и списки на первый взгляд похожи — оба упорядоченные последовательности, оба поддерживают индексирование и итерацию, — но одно критичное отличие меняет всё: кортежи неизменяемы. После создания кортеж нельзя пополнить, укоротить или заменить в нём элемент.
Пишут кортежи в круглых скобках (а иногда и без):
Кортежу из одного элемента нужна запятая в конце, иначе Python воспримет скобки как группировку:
А пустой кортеж — это ():
Неизменяемость на практике
Попробуешь изменить кортеж — Python тебя остановит:
Из кортежа можно свободно читать: индексировать, срезать, итерировать, использовать in, — просто нельзя модифицировать. Нужен другой кортеж — создай новый.
Зачем нужно что-то, что нельзя менять?
Неизменяемость звучит как ограничение, но часто именно это и нужно.
- Безопасность. Кортеж, переданный в функцию, не может быть изменён за твоей спиной.
- Хэшируемость. Кортежи из неизменяемых значений можно использовать как ключи словаря или элементы множества; списки — нельзя.
- Намерение. Кортеж говорит «это запись фиксированной формы».
point = (3, 4)яснее передаёт «две координаты», чемpoint = [3, 4].
Кортежи блестят там, где:
- Координаты:
(x, y),(lat, lon) - RGB-цвета:
(255, 128, 0) - Записи:
(name, email, signup_date) - Возврат нескольких значений из функции
Распаковка
Кортежи и синтаксис распаковки созданы друг для друга:
Распаковку делает запятая слева. Python видит два имени и кортеж из двух значений и связывает их попарно.
В идиоматичном Python это повсюду:
С * можно собрать «остаток»:
Удобно, когда интересны только первый и последний элементы.
Кортежи как ключи словаря
Поскольку кортежи хэшируемы (при условии, что их содержимое тоже), их можно использовать как ключи словаря. Списки так не умеют:
Этот паттерн — ключ как составной набор значений — неожиданно полезен. Представь: «оценка пользователя X в день Y» или «лучший маршрут из A в B».
Кортежи для нескольких возвращаемых значений
Функция, которой нужно вернуть больше одного значения, обычно возвращает кортеж:
Встроенный divmod() делает именно так. Распаковка на стороне вызова делает чтение естественным.
Именованные кортежи, когда позиции мало
Когда кортежи вырастают за два-три элемента, запоминать, что означает каждая позиция, становится утомительно. collections.namedtuple это чинит:
Теперь у элементов кортежа есть имена. Он всё ещё неизменяем, всё ещё кортеж (распаковка и индексирование работают), но обращение заметно дружелюбнее. Для чего-то посложнее есть dataclasses — встретимся с ними в главе о классах.
Кортеж против списка: быстрый гид
- Фиксированная форма, у каждой позиции есть смысл → кортеж.
- Коллекция может расти или сжиматься → список.
- Возврат нескольких значений из функции → кортеж.
- Нужен ключ словаря или элемент множества → кортеж (список не подойдёт).
- Собираешься модифицировать → список (кортеж не даст).
Дальше
Кортежи покрывают один конец спектра: фиксированные, маленькие, структурированные. Дальше — множества, у которых совершенно другая работа: быстрая проверка принадлежности и уникальность.
Часто задаваемые вопросы
Что такое кортеж в Python?
Кортеж — это упорядоченная неизменяемая последовательность, вроде списка, но после создания нельзя ни добавить, ни удалить, ни изменить элементы. Пишут кортежи в круглых скобках: point = (3, 4).
В чём разница между кортежем и списком?
Оба — упорядоченные последовательности. Списки изменяемы — их можно менять после создания, — а кортежи нет. Кортежи обычно используют для маленьких коллекций значений, которые вместе составляют единую «запись», — координаты или несколько возвращаемых значений функции.
Когда использовать кортеж?
Когда есть запись фиксированного размера, где у каждой позиции есть смысл — координаты, RGB-цвет, строка из базы. Также кортежи используют как ключи словаря или элементы множества, потому что списки там нельзя. Во всех остальных случаях, когда коллекция может расти или сжиматься, по умолчанию — список.