Кортежи (tuple)

Списки хорошо подходят для хранения наборов элементов, которые могут изменяться на протяжении жизненного цикла программы. Например, возможность модификации списков жизненно необходима при работе со списками пользователей сайта или списками персонажей игры. Однако в некоторых ситуациях требуется создать список элементов, который не может изменяться. Кортеж (tuple) - это по сути неизменяемый список.

Кортеж - это упорядоченная последовательность из нуля или более ссылок на объекты. Относятся к категории неизменяемых (immutable) объектов, во многом другом повторяет функционал типа list.
Работа с индексами и срезами
Синтаксис получения срезов тот же самый что и у списков, операции создания, изменения и удаления частей кортежа запрещены и вызывают исключение TypeError.

Несмотря на тот факт, что кортежи намного реже встречаются в коде и не так популярны, это очень фундаментальный тип, который Python постоянно использует для внутренних целей. Вы можете не замечать, но вы используете кортежи когда:

  • работаете с аргументами или параметрами (они хранятся как кортежи);
  • возвращаете две или более переменных из функции;
  • итерируете ключи-значения в словаре;
  • используете форматирование строк;
Создадим кортеж: t = ('text', ('a', 'b'), 1, 2, 3)
Методы
Операции

Для кортежей доступен ряд перегруженных операций:
Что нужно знать о кортежах
1. Пустой кортеж работает как синглтон, т.е. в памяти запущенного Python скрипта всегда находится только один пустой кортеж. Все пустые кортежи просто ссылаются на один и тот же объект, это возможно благодаря тому, что кортежи неизменяемы. Такой подход сохраняет много памяти и ускоряет процесс работы с пустыми кортежами.
a, b = (), ()
print('a is b =', a is b) # True
print('id(a)=', id(a))
print('id(b)=', id(b))
2. Для того, чтобы снизить фрагментацию памяти и ускорить создание кортежей, Python переиспользует старые объекты кортежей в памяти, ссылки на которые были удалены. Если кортеж состоит из менее чем 20 элементов и больше не используется, то он помещается в специальный список, в котором хранятся свободные для повторного использования кортежи. Этот список разделен на 20 групп, где каждая группа представляет из себя список кортежей размера n, где n от 0 до 20. Каждая группа может хранить до 2 000 свободных кортежей. Первая группа хранит только один элемент и представляет из себя список из одного пустого кортежа.
a = (1,2,3)
print('id(a)=', id(a)) # 140421271879824
del a
b = (1,2,4)
print('id(b)=', id(b)) # 140421271879824
В примере выше, мы можем видеть, что a и b имеют одинаковый адрес в памяти. Это происходит из-за того, что мы мгновенно заняли свободный кортеж такого же размера.
Веб версия компилятора не позволяет это сделать, проверьте на своей рабочей машине!

3. Кортежи могут быть свернуты в константу на этапе компиляции (constant folding). Свертка констант - оптимизация, вычисляющая константные выражения на этапе компиляции. Таким образом для работы с кортежем требуется меньше действий интерпретатора, чем при работе со списком. Для того чтобы это увидеть используем модуль dis, который позволяет декомпилировать байт-код и проанализировать его:
from dis import dis
print('Создание кортежа:')
dis(compile("(10, 'abc')", '', 'eval')) # 2 операции
print('Создание списка:')
dis(compile("[10, 'abc']", '', 'eval')) # 4 операции