Python: уроки, справочник и задачи

Работа с кортежами в Python

Раздел: Списки, кортежи и множества · Обновлено 31.10.2026

Кортеж в Python (tuple) - это упорядоченная неизменяемая последовательность, которую после создания нельзя дополнить или отредактировать. В статье разобраны способы создания кортежа, доступ по индексу и срезы, распаковка, методы count() и index(), отличия от списка и именованные кортежи.

Работа с кортежами в Python
Фото: Miaow Miaow / Public domain, Wikimedia Commons
Содержание статьи
  1. Как создать кортеж
  2. Индексы, срезы и перебор
  3. Распаковка кортежа
  4. Неизменяемость и ее границы
  5. Операции и методы кортежа
  6. Чем кортеж отличается от списка
  7. Именованные кортежи
  8. Частые вопросы
    1. Как добавить элемент в кортеж?
    2. Как превратить кортеж в список и обратно?
    3. Почему (5) не кортеж?
    4. Можно ли отсортировать кортеж?

Как создать кортеж

Кортеж записывается через запятую, обычно в круглых скобках. Элементы могут быть любых типов, в том числе другие кортежи и списки. Функция type() для такого объекта возвращает <class 'tuple'>.

empty = ()
numbers = (1, 2, 3)
mixed = ('hello', 1, 2.5, [10, 11])
from_list = tuple([4, 5, 6])
from_str = tuple('abc')

print(mixed)     # ('hello', 1, 2.5, [10, 11])
print(from_str)  # ('a', 'b', 'c')

Кортеж создается именно запятой, а не скобками. Поэтому запись point = 3, 4 тоже дает кортеж, такой прием называют упаковкой. Отсюда главная ловушка для новичков: кортеж из одного элемента требует запятую в конце.

a = ('hello')
b = ('hello',)
print(type(a))  # <class 'str'>
print(type(b))  # <class 'tuple'>

Не называйте переменную tuple: имя перекроет встроенную функцию, и вызов tuple([1, 2]) дальше в программе выбросит TypeError.

Индексы, срезы и перебор

Доступ к элементам кортежа устроен так же, как у списка и строки. Индексация начинается с нуля, отрицательный индекс считает элементы с конца, а срез возвращает новый кортеж.

days = ('пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс')
print(days[0])     # пн
print(days[-1])    # вс
print(days[:5])    # ('пн', 'вт', 'ср', 'чт', 'пт')
print(days[::-1])  # кортеж в обратном порядке

for i, day in enumerate(days, start=1):
    print(i, day)

Обращение к несуществующему индексу вызывает IndexError. Подробнее синтаксис с началом, концом и шагом разобран в статье про срезы в Python.

Распаковка кортежа

Распаковка присваивает элементы кортежа сразу нескольким переменным. Количество переменных слева должно совпадать с длиной кортежа, иначе будет ValueError.

user = ('Анна', 28, 'Москва')
name, age, city = user
print(name, age)  # Анна 28

first, *rest = (1, 2, 3, 4)
print(rest)       # [2, 3, 4]

x, y = 1, 2
x, y = y, x       # обмен значений без временной переменной
print(x, y)       # 2 1

Переменная со звездочкой забирает все оставшиеся элементы и всегда становится списком. Распаковка часто встречается в циклах: for key, value in d.items() перебирает пары-кортежи, которые возвращает словарь. Функция, которая пишет return a, b, тоже возвращает кортеж, и его удобно сразу распаковать при вызове.

Неизменяемость и ее границы

Присвоить новое значение элементу кортежа, удалить элемент или добавить новый нельзя. У кортежа нет методов append(), remove() и sort().

t = (1, 2, 3)
t[0] = 5
# TypeError: 'tuple' object does not support item assignment

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

t = (1, 2, [6, 5])
t[2][0] = 9
print(t)  # (1, 2, [9, 5])

Из-за этого кортеж со списком внутри нельзя использовать как ключ словаря: hash(t) выбросит TypeError: unhashable type: 'list'. Чтобы получить измененную версию кортежа, создают новый: через сложение, срезы или преобразование в список и обратно. Целиком переменную удаляет оператор del t, после чего обращение к ней вызывает NameError.

Операции и методы кортежа

Кортежи поддерживают сложение, повторение, проверку вхождения и все встроенные функции для последовательностей. Любая операция, которая что-то меняет, возвращает новый объект.

a = (1, 2, 3)
print(a + (4, 5))       # (1, 2, 3, 4, 5)
print(('ок',) * 3)      # ('ок', 'ок', 'ок')
print(2 in a)           # True
print(len(a), sum(a), max(a))  # 3 6 3

colors = ('red', 'blue', 'green', 'blue')
print(colors.count('blue'))     # 2
print(colors.index('blue'))     # 1
print(colors.index('blue', 2))  # 3
print(sorted(colors))           # список, а не кортеж

Собственных методов у кортежа всего два: count() считает вхождения значения, index() возвращает позицию первого вхождения и принимает необязательные границы поиска. Если значения нет, index() выбрасывает ValueError. Функция sorted() работает с кортежем, но результат всегда список, при необходимости его оборачивают в tuple().

Чем кортеж отличается от списка

Синтаксически кортеж и список похожи, но назначение у них разное. Список подходит для однотипных данных, которые растут и меняются, кортеж - для фиксированной записи, где позиция элемента имеет смысл: координаты, цвет RGB, строка из базы данных.

Свойствоtuplelist
Изменяемостьнетда
Литерал(1, 2, 3)[1, 2, 3]
Методыcount(), index()11 методов, включая append() и sort()
Ключ словаря, элемент множествада, если внутри только неизменяемые объектынет
Размер sys.getsizeof для трех чисел64 байта88 байт

Размеры приведены для 64-битного CPython и показывают только сам контейнер. Выигрыш в скорости у кортежа есть, но небольшой, поэтому выбирать тип стоит по смыслу данных. Если коллекция должна меняться, нужен список, а кортеж защитит константы от случайной перезаписи.

Именованные кортежи

Когда в кортеже больше трех полей, обращения вида user[2] становятся нечитаемыми. Функция namedtuple из модуля collections создает класс кортежа с именованными полями. Объект остается обычным кортежем: его можно распаковать и использовать как ключ.

from collections import namedtuple

Point = namedtuple('Point', 'x y')
p = Point(3, 4)
print(p.x, p[1])          # 3 4
print(p._replace(x=10))   # Point(x=10, y=4)
print(p._asdict())        # {'x': 3, 'y': 4}

Метод _replace() не меняет объект, а возвращает новый с обновленным полем. В коде с аннотациями типов вместо namedtuple часто пишут класс-наследник typing.NamedTuple, поведение у них одинаковое.

Частые вопросы

Ответы на вопросы, которые чаще всего задают о кортежах.

Как добавить элемент в кортеж?

Изменить существующий кортеж нельзя, но можно создать новый: t = t + (4,). Если элементы добавляются часто, удобнее работать со списком и превратить его в кортеж в конце через tuple().

Как превратить кортеж в список и обратно?

Функция list(t) создает список из кортежа, функция tuple(lst) делает обратное преобразование. Оба вызова создают новый объект, исходный не меняется.

Почему (5) не кортеж?

Скобки вокруг одного значения Python считает группировкой выражения, как в (2 + 3) * 4. Кортеж из одного элемента записывается с запятой: (5,) или просто 5,.

Можно ли отсортировать кортеж?

Метода sort() у кортежа нет. Используйте tuple(sorted(t)): функция вернет отсортированный список, который затем превращается в новый кортеж.