Глава 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). Разница только одна, но
принципиальная: кортеж нельзя изменить.
| list | tuple | |
|---|---|---|
| Синтаксис | [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
Мы уже пользовались распаковкой
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, без установки