Кортежи

Мы изучили списки и строки. Списки – изменяемые коллекции, строки – неизменяемые последовательности Unicode символов. В Python имеются и неизменяемые последовательности, содержащие, в отличие от строк, абсолютно произвольные данные. Такие коллекции называются кортежами (tuple, читается "тюпл").

Рассмотрим следующий программный код:

my_list = [1, 2, 3, 4, 5]

Мы объявили список чисел и присвоили его переменной my_list. Содержимое списка можно изменять.

Следующий программный код:

my_list = [1, 2, 3, 4, 5]
my_list[0] = 9
my_list[4] = 7
print(my_list)

выведет:

[9, 2, 3, 4, 7]

Заменив квадратные скобки при объявлении списка на круглые, мы объявляем кортеж:

my_tuple = (1, 2, 3, 4, 5)

Кортежи по своей природе (задумке) – неизменяемые аналоги списков. Поэтому программный код:

my_tuple = (1, 2, 3, 4, 5)
my_tuple[0] = 9
my_tuple[4] = 7
print(my_tuple)

приводит к ошибке

TypeError: 'tuple' object does not support item assignment

Кортеж (tuple) – ещё один вид коллекций в Python. Они похожи на списки, но являются неизменяемыми.

В литеральной форме кортеж записывается в виде последовательности элементов в круглых скобках, а список – в квадратных.

Примеры кортежей

empty_tuple = ()                                     # пустой кортеж
point = (1.5, 6.0)                                   # кортеж из двух чисел
names = ('Timur', 'Ruslan', 'Roman')                 # кортеж из трех строк
info = ('Timur', 'Guev', 28, 170, 60, False)         # кортеж из 6 элементов разных типов
nested_tuple = (('one', 'two'), ['three', 'four'])   # кортеж из кортежа и списка

Кортежи могут хранить и содержать в себе объекты любых типов (даже составных) и поддерживают неограниченное количество уровней вложенности.

Кортеж с одним элементом

Для создания кортежа с единственным элементом после значения элемента ставят замыкающую запятую:

my_tuple = (1,)
print(type(my_tuple))  # <class 'tuple'>

Если запятую пропустить, то кортеж создан не будет. Например, приведенный ниже код просто присваивает переменной my_tuple целочисленное значение 1:

my_tuple = (1)
print(type(my_tuple))  # <class 'int'>

Зачем использовать кортеж вместо списка?

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

В Python существуют операции, требующие применения кортежа. По мере освоения языка Python вы будете чаще сталкиваться с кортежами.

Примечания

Примечание 1. Мы уже  сталкивались с кортежами, когда изучали функции, возвращающие несколько значений. Такие функции возвращают именно кортежи.

Рассмотрим функцию get_powers(), которая принимает в качестве аргумента число и возвращает его 22, 33 и 44 степень.

def get_powers(num):
    return num**2, num**3, num**4

Результатом выполнения следующего кода:

result = get_powers(5)
print(type(result))
print(result)

будет:

<class 'tuple'>
(25, 125, 625)

Примечание 2. Списки предназначены для объединения неопределенного количества однородных сущностей. Кортежи, как правило, объединяют под одним именем несколько разнородных объектов, имеющих различный смысл.

Например, список удобен для хранения нескольких городов:

cities = ['Perth', 'San Francisco', 'Lisbon', 'Sochi']

А кортеж удобен для хранения данных о людях:

person = ('Vasya', 27, 'Auckland')

Примечание 3. Тот факт, что кортеж является неизменяемым вовсе не означает, что мы не можем поменять содержимое списка в кортеже.

Приведенный ниже код:

my_tuple = (1, 'python', [1, 2, 3])
print(my_tuple)
my_tuple[2][0] = 100
my_tuple[2].append(17)
print(my_tuple)

выводит:

(1, 'python', [1, 2, 3])
(1, 'python', [100, 2, 3, 17])

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