Menu
Русский

Кортежи в Python: неизменяемые последовательности, распаковка и namedtuple

Когда выбрать кортеж вместо списка — неизменяемость, распаковка, namedtuple и сценарии, ради которых кортежи и существуют.

Кортеж — это список, который нельзя менять

Кортежи и списки на первый взгляд похожи — оба упорядоченные последовательности, оба поддерживают индексирование и итерацию, — но одно критичное отличие меняет всё: кортежи неизменяемы. После создания кортеж нельзя пополнить, укоротить или заменить в нём элемент.

Пишут кортежи в круглых скобках (а иногда и без):

main.py
Output
Click Run to see the output here.

Кортежу из одного элемента нужна запятая в конце, иначе Python воспримет скобки как группировку:

main.py
Output
Click Run to see the output here.

А пустой кортеж — это ():

main.py
Output
Click Run to see the output here.

Неизменяемость на практике

Попробуешь изменить кортеж — Python тебя остановит:

main.py
Output
Click Run to see the output here.

Из кортежа можно свободно читать: индексировать, срезать, итерировать, использовать in, — просто нельзя модифицировать. Нужен другой кортеж — создай новый.

Зачем нужно что-то, что нельзя менять?

Неизменяемость звучит как ограничение, но часто именно это и нужно.

  1. Безопасность. Кортеж, переданный в функцию, не может быть изменён за твоей спиной.
  2. Хэшируемость. Кортежи из неизменяемых значений можно использовать как ключи словаря или элементы множества; списки — нельзя.
  3. Намерение. Кортеж говорит «это запись фиксированной формы». point = (3, 4) яснее передаёт «две координаты», чем point = [3, 4].

Кортежи блестят там, где:

  • Координаты: (x, y), (lat, lon)
  • RGB-цвета: (255, 128, 0)
  • Записи: (name, email, signup_date)
  • Возврат нескольких значений из функции

Распаковка

Кортежи и синтаксис распаковки созданы друг для друга:

main.py
Output
Click Run to see the output here.

Распаковку делает запятая слева. Python видит два имени и кортеж из двух значений и связывает их попарно.

В идиоматичном Python это повсюду:

main.py
Output
Click Run to see the output here.

С * можно собрать «остаток»:

main.py
Output
Click Run to see the output here.

Удобно, когда интересны только первый и последний элементы.

Кортежи как ключи словаря

Поскольку кортежи хэшируемы (при условии, что их содержимое тоже), их можно использовать как ключи словаря. Списки так не умеют:

main.py
Output
Click Run to see the output here.

Этот паттерн — ключ как составной набор значений — неожиданно полезен. Представь: «оценка пользователя X в день Y» или «лучший маршрут из A в B».

Кортежи для нескольких возвращаемых значений

Функция, которой нужно вернуть больше одного значения, обычно возвращает кортеж:

main.py
Output
Click Run to see the output here.

Встроенный divmod() делает именно так. Распаковка на стороне вызова делает чтение естественным.

Именованные кортежи, когда позиции мало

Когда кортежи вырастают за два-три элемента, запоминать, что означает каждая позиция, становится утомительно. collections.namedtuple это чинит:

main.py
Output
Click Run to see the output here.

Теперь у элементов кортежа есть имена. Он всё ещё неизменяем, всё ещё кортеж (распаковка и индексирование работают), но обращение заметно дружелюбнее. Для чего-то посложнее есть dataclasses — встретимся с ними в главе о классах.

Кортеж против списка: быстрый гид

  • Фиксированная форма, у каждой позиции есть смысл → кортеж.
  • Коллекция может расти или сжиматься → список.
  • Возврат нескольких значений из функции → кортеж.
  • Нужен ключ словаря или элемент множества → кортеж (список не подойдёт).
  • Собираешься модифицировать → список (кортеж не даст).

Дальше

Кортежи покрывают один конец спектра: фиксированные, маленькие, структурированные. Дальше — множества, у которых совершенно другая работа: быстрая проверка принадлежности и уникальность.

Часто задаваемые вопросы

Что такое кортеж в Python?

Кортеж — это упорядоченная неизменяемая последовательность, вроде списка, но после создания нельзя ни добавить, ни удалить, ни изменить элементы. Пишут кортежи в круглых скобках: point = (3, 4).

В чём разница между кортежем и списком?

Оба — упорядоченные последовательности. Списки изменяемы — их можно менять после создания, — а кортежи нет. Кортежи обычно используют для маленьких коллекций значений, которые вместе составляют единую «запись», — координаты или несколько возвращаемых значений функции.

Когда использовать кортеж?

Когда есть запись фиксированного размера, где у каждой позиции есть смысл — координаты, RGB-цвет, строка из базы. Также кортежи используют как ключи словаря или элементы множества, потому что списки там нельзя. Во всех остальных случаях, когда коллекция может расти или сжиматься, по умолчанию — список.

Учитесь программировать с Coddy

НАЧАТЬ