Tuple в Python: неизменяемый кортеж и доступ по индексу
Кортеж хранит фиксированный набор значений и защищает его от изменений: создали — и состав застыл. Создание, доступ по индексу, IndexError и то, почему запятая главнее скобок.
Редакция Питоники
Первая половина курса — про множества без порядка. Вторая — про структуры, где порядок есть и застыл: кортежи. Координаты точки, дата как тройка «день, месяц, год», RGB-цвет — наборы, где значения идут парой или тройкой и не имеют права меняться. В уроке 10 была неизменяемость без порядка — frozenset; теперь неизменяемость с порядком.
Создание кортежа
point = (2, 3)
date = (14, 8, 2026)
print(point)
print(len(date))
print(type(point))
(2, 3) 3 <class 'tuple'>
Кортеж печатается целиком и в том же порядке, как задан: (2, 3) останется (2, 3) при любом запуске — порядок здесь фиксирован, в отличие от множеств. len считает элементы, type подтверждает тип.
Запятая главнее скобок
single = (5,)
number = (5)
print(single)
print(type(number))
print(len(single))
(5,) <class 'int'> 1
Запятая делает кортеж, а не скобки: (5) — это число пять, и только (5,) — кортеж из одного элемента. Скобки служат оформлением для глаз, запятая — смыслом: без неё это просто выражение в скобках, как (2 + 3).
p = 2, 3
print(p)
print(type(p))
(2, 3) <class 'tuple'>
Python собирает кортеж из значений через запятую даже без скобок. Такой синтаксис встречается у возврата из функций — об этом урок 14.
Доступ по индексу
date = (14, 8, 2026)
print(date[0])
print(date[-1])
print(date[1:])
print(date[0] + date[1])
print(date.index(8))
print(date.count(14))
14 2026 (8, 2026) 22 1 1
Индексация как у списков: с нуля, отрицательные — с конца. Срез возвращает новый кортеж с частью элементов, методы index и count ищут по значениям, in проверяет наличие. Границы тоже как у списка: выход за пределы роняет программу:
date = (14, 8, 2026)
print(date[5])
Traceback (most recent call last):
File "app.py", line 2, in <module>
print(date[5])
~~~~^^^
IndexError: tuple index out of rangeНеизменяемость: главная черта
point = (2, 3)
point[0] = 10
print(point)
Traceback (most recent call last):
File "app.py", line 2, in <module>
point[0] = 10
~~~~~^^^
TypeError: 'tuple' object does not support item assignmentПрисваивание по индексу запрещено — это и есть неизменяемость: состав кортежа застыл. Что делать, когда значение должно обновиться? Собрать новый кортеж из старого:
point = (2, 3)
moved = (point[0] + 5, point[1])
print(point)
print(moved)
(2, 3) (7, 3)
Исходник цел, обновлённая версия — отдельный объект. Кортежи склеиваются плюсом и повторяются звёздочкой — тоже создавая новые:
t = (1, 2)
print(t + (3, 4))
print(t * 2)
(1, 2, 3, 4) (1, 2, 1, 2)
tuple() из последовательности
print(tuple([1, 2, 3]))
print(tuple('кот'))
print(tuple(range(3)))
(1, 2, 3)
('к', 'о', 'т')
(0, 1, 2)Конструктор принимает любую последовательность: список станет кортежем — удобно сделать снимок данных, строка распадётся на символы, range развернётся в числа. Обратная дорога — list(t) — даёт изменяемый список.
| Операция | Пример | Что делает |
|---|---|---|
| доступ по индексу | point[0], point[-1] | элемент по позиции |
| срез | date[1:] | новый кортеж с частью элементов |
| in и len | 2 in point | проверка наличия и размер |
| count и index | date.count(14) | поиск по значениям |
| + и * | t + (3,) | новый кортеж: склейка или повтор |
| tuple() | tuple([1, 2]) | кортеж из любой последовательности |
Что дальше
Кортеж умеет всё то же, что список, кроме изменения — и в этом его сила. В уроке 12 сводим соперников в таблицу: скорость, память, ключ словаря и правило выбора между tuple и list за три секунды.
Кортеж как ключ словаря: где это спасает
Практическая суперспособность кортежей — быть ключами словаря. Список не может: он изменяемый, и Python запретит его класть в словарь. Кортеж — можно, и это открывает словари с координатами, парами городов, комбинациями параметров — где ключ это две-три связанные величины, а не одна строка.
Типовой сценарий: таблица расстояний между городами. Ключ — кортеж (город_от, город_до), значение — километры. Один словарь вместо вложенных словарей и без риска рассинхронизации строк и столбцов: distances[('Москва', 'Сочи')] = 1600.
| Ключ | Пример из жизни |
|---|---|
| (город_от, город_до) | таблица расстояний и тарифов |
| (строка, столбец) | клетки поля: ходы фигур, мины в сапёре |
| (год, месяц) | агрегаты по периодам |
| (имя, размер) | склад: сколько чего лежит |
Отсюда правило дизайна данных: если ключ должен быть «пачкой связанных значений» — кортеж. Список годится для коллекции одинаковых элементов, которую вы будете менять; кортеж — для связанной группы разных величин, которую менять нельзя.
Сначала предскажи ответ в голове — это главный навык программиста.
t = (10, 20, 30)
print(t[1] + t[-1])
print(len(t))
single = (7)
print(single + 3)
point = (2, 3)
shifted = point + (1,)
print(shifted)
print(point)
1. Что вернёт type((5))?
2. point = (2, 3). Что произойдёт при point[0] = 10?
3. Что вернёт (2, 3) + (4,)?
4. Чему равен len(tuple('кот'))?
5. date = (14, 8, 2026). Что вернёт date[-1]?
6. Чем кортеж отличается от списка?
7. Что вернёт t * 2 при t = (1, 2)?
8. Как обратиться к последнему элементу кортежа t?
Дан кортеж point = (3, 4). Выведите первый элемент, последний и их сумму — три печати.
Что такое кортеж в Python простыми словами?
Фиксированный набор значений, который нельзя менять после создания: point = (2, 3). Читается по индексам как список, но без append и присваивания — состав защищён от случайных правок.
Урок 12: кортеж против спискаКак создать кортеж из одного элемента?
Поставить запятую: (5,). Без неё (5) — просто число в скобках: кортеж делает запятая, а не скобки.
Можно ли изменить кортеж?
Нет: присваивание по индексу и методы вроде append падают с TypeError. Варианты — собрать новый кортеж: t + (x,) или превратить в список: list(t).
Чем кортеж отличается от списка?
Чтение одинаковое — индексы, срезы, len, in. Разница в изменяемости: список можно дополнять и переписывать, кортеж — нет. Отсюда ещё два следствия: кортеж занимает меньше памяти и может быть ключом словаря.
Зачем кортежи, если есть списки?
Защита и смысл: координаты, даты и цвета не должны меняться — кортеж гарантирует это на уровне языка. Плюс кортеж работает ключом словаря и элементом множества — списку это недоступно.
Понравился урок? Сошлитесь на него
«Запятая делает кортеж, а не скобки: (5) — это число пять, и только (5,) — кортеж из одного элемента.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Множества · Урок 10
frozenset: неизменяемое множество в Python
Множество, которое нельзя менять: frozenset создаётся один раз, поддерживает все проверки и операции чтения и годится туда, куда set не пускают — ключом в словарь и элементом другого множества.
Множества · Урок 12
Кортеж против списка в Python: что и когда использовать
У обоих есть индексы, len и in, но список можно менять, а кортеж — нет. Четыре отличия: изменяемость, ключ словаря, память и правило выбора за три секунды.
Множества · Урок 13
Распаковка кортежей в Python: x, y = point
Один кортеж — несколько переменных за один шаг: x, y = point. Классический обмен значений, звёздочка для остатка и почему распаковывать множества опасно.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
NumPy · Урок 3
Индексация и срезы массивов NumPy: как достать любой элемент
Индексы с нуля и с конца, срезы с шагом, строки и столбцы двумерных массивов — и главный подводный камень NumPy: срез возвращает view, а не копию. С примерами, разбором ошибок и шпаргалкой.
numpy индекс элемента
NumPy · Урок 8
Булева индексация и маски: фильтрация данных в NumPy
Достаём из массива только нужное: булевы маски, операторы & | ~ вместо and/or, np.where в двух ролях, argmax и честная чистка выбросов в данных датчика.
как найти индекс максимального элемента numpy
Множества · Урок 15
namedtuple в Python: кортеж с именами полей
namedtuple даёт кортежу имена полей: p.x вместо p[0], читаемый repr и всё кортежное на месте — индексы, распаковка, сравнение. Шесть строк кода, и записи перестают быть наборами индексов.
кортеж с именами полей pythonnamedtuple доступ по имени