Глава 11 · Очень много информации!

Кортежи

Почти список, но неизменяемый — и именно поэтому иногда более подходящий выбор.

Кортеж (tuple) — не «список в круглых скобках», а отдельная идея: иногда несколько значений логически образуют ОДНУ запись (координата, RGB-цвет), и хочется быть уверенным, что её случайно не изменят.

kortezhi.py
point = (10, 20)
print(point)
print(point[0])   # 10 — индексация работает как у списков
kortezh_nelzya_menyat.py
point = (10, 20)
point[0] = 99   # TypeError: 'tuple' object does not support item assignment

Кортеж — последовательность, как и список

len, индексация, срезы, перебор, in — всё это работает у кортежа так же, как у списка (§11.1–§11.2). Разница только одна, но принципиальная: кортеж нельзя изменить.

listtuple
Синтаксис[1, 2, 3](1, 2, 3)
Изменяем?данет
Индексация, срезы, len, inдада

Кортеж из одного элемента — нужна запятая

odinochnyj_kortezh.py
not_a_tuple = (42)
print(type(not_a_tuple))   # <class 'int'>

one = (42,)
print(type(one))            # <class 'tuple'>
Кортеж создаёт запятая, а не круглые скобки
(42) — это просто число 42 в скобках, как в математике. Кортежем его делает запятая: (42,). Без запятой Python не поймёт, что вы хотели кортеж, и тихо создаст обычное число — без ошибки, что особенно коварно.

Packing и unpacking

packing.py
point = 10, 20   # скобки необязательны — Python «упаковывает» в кортеж сам
print(point, type(point))
raspakovka.py
point = (10, 20)
x, y = point
print(x, y)   # 10 20
point = (10, 20)x10y20
x, y = point — распаковка: число имён должно совпадать с числом значений
Мы уже пользовались распаковкой
artist.position() в модуле turtle возвращает именно такой кортеж (x, y) — можно сразу распаковать его в две переменные.

Классический трюк: обмен значений

swap.py
a = 1
b = 2
a, b = b, a
print(a, b)   # 2 1

Работает благодаря той же паре «packing + unpacking»: справа сначала упаковывается кортеж (b, a), потом он распаковывается в a, b — без промежуточной переменной.

Звёздочная распаковка

star_unpacking.py
first, *middle, last = [1, 2, 3, 4, 5]
print(first)    # 1
print(middle)   # [2, 3, 4]
print(last)     # 5
Звёздочка собирает «всё остальное» в список
*middle забирает все значения, не разобранные другими именами, и упаковывает их в обычный список — даже если распаковывается кортеж.

Функции могут возвращать несколько значений сразу

divmod_primer.py
quotient, remainder = divmod(17, 5)
print(quotient, remainder)   # 3 2

divmod() из главы 4 на самом деле возвращает один кортеж (3, 2) — просто мы сразу распаковываем его в две переменные.

Нюанс: кортеж может содержать изменяемые объекты

tuple_s_listom.py
t = ([1, 2], [3, 4])
t[0].append(99)
print(t)   # ([1, 2, 99], [3, 4]) — сработало!
Неизменяемость кортежа — только про сами «ячейки»
t[0] = [...] (заменить ссылку на другой список) — запрещено. А вот t[0].append(99) (изменить сам список, на который кортеж ссылается) — разрешено: кортеж не даёт переставить, ЧТО он хранит по каждой позиции, но не запрещает изменяемым объектам внутри меняться.
Практика: кортежи и распаковка
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →