2.8. Кортежи

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

2.8.1. Создание кортежей

Используйте круглые скобки (или просто запятые) для создания кортежа:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. Подводный камень с одним элементом

Круглые скобки вокруг значения — это просто скобки; то, что на самом деле создаёт кортеж, — это запятая. Кортежу из одного элемента нужна завершающая запятая:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. Длина, индексация и срезы

Так же, как у списков и строк — len(), индексация, срезы, in и + / * работают одинаково:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. Неизменяемость

У кортежей нет append, pop, sort или какого-либо другого метода, изменяющего на месте. Присваивание по индексу вызывает TypeError:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

Чтобы «изменить» кортеж, постройте новый с изменёнными значениями.

2.8.4. Распаковка

Главная суперсила кортежа — распаковка: присваивание каждого элемента отдельной переменной в одном выражении.

Кортеж из трёх элементов (1, 2, 3), распаковываемый в три именованные переменные x, y, z.

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

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

Правая часть может быть любым итерируемым объектом — списком, строкой, возвращаемым значением функции:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

Ведущая * собирает «остальное» при распаковке в список:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. Несколько возвращаемых значений

Функция может вернуть кортеж, чтобы доставить несколько значений сразу; вызывающий код распаковывает их на входе:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

Круглые скобки в return необязательны — голый return a, b тоже является кортежем.

2.8.6. Кортеж против списка

Практическое руководство, к чему обращаться:

  • Кортеж для данных фиксированной формы, часто разнородных: точки (x, y), цвета (r, g, b), несколько возвращаемых значений, аргументы функции, упакованные для последующего использования.

  • Список для данных переменной длины, часто однородных: список измерений, очередь элементов для обработки, всё, к чему вы планируете добавлять.

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