Гид по технологиям

Кортежи в Python: руководство и лучшие практики

6 min read Python Обновлено 17 Apr 2026
Кортежи в Python: руководство
Кортежи в Python: руководство

Руки печатают на клавиатуре ноутбука

Кортеж — это коллекция неизменяемых объектов Python. Он может содержать элементы любых типов (целые числа, строки, числа с плавающей точкой, списки и т. д.), что делает его гибкой и полезной структурой данных. Кортежи являются частью ядра Python и широко применяются в программах и проектах.

Что такое кортеж?

Коротко: кортеж — это упорядоченная, индексируемая и неизменяемая последовательность. “Неизменяемая” означает, что после создания вы не можете поменять отдельные элементы кортежа напрямую. Это отличает кортежи от списков и даёт преимущества по безопасности данных и скорости доступа.

Ключевые свойства в 1 строке:

  • Упорядоченность — элементы имеют фиксированные индексы.
  • Неизменяемость — нет прямого присваивания элементам.
  • Поддержка дублирования — одинаковые значения допустимы.
  • Поддержка вложенности — кортежи можно вкладывать друг в друга.

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

Кортеж создаётся путём перечисления через запятую внутри круглых скобок ().

t1 = (1, 2, 3, 4)
t2 = ("Make", "Use", "Of")
t3 = (1.2, 5.9, 5.4, 9.3)

Элементы кортежа упорядочены и неизменяемы. Кортеж может быть пустым, содержать повторяющиеся значения и элементы любых типов.

Пример кортежей в Python

Пустой кортеж

Пустой кортеж создаётся пустыми скобками:

emptyTuple = ()

Кортеж с одним элементом

Чтобы Python распознал кортеж из одного элемента, после элемента нужно поставить запятую.

# t1 — кортеж
t1 = (3.14,)
print(type(t1))
# prints
# 

Без запятой Python воспримет выражение как скобки вокруг значения, а не как кортеж:

# t2 — не кортеж
t2 = (3.14)
print(type(t2))
# prints
# 

Важно: функция type() возвращает тип переданного объекта.

Кортеж с разными типами данных

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

tup1 = ('MUO', True, 3.9, 56, [1, 2, 3])
print(tup1)
# prints
# ('MUO', True, 3.9, 56, [1, 2, 3])

Создание кортежа через конструктор tuple()

Конструктор tuple() позволяет преобразовать другие итерируемые объекты (списки, словари и т. д.) в кортеж.

tup1 = tuple((1, 2, 3))
print(tup1)
# prints
# (1, 2, 3)

Вложенный кортеж

Кортежи можно вкладывать друг в друга на любую глубину:

tup1 = (1, 2, 3)
tup2 = ('Hello', tup1, 45)
print(tup2)
# prints
# ('Hello', (1, 2, 3), 45)

Доступ к элементам кортежа

Доступ к элементам осуществляется через индекс в квадратных скобках. Индексация начинается с 0. Поддерживается отрицательная индексация:

  • -1 указывает на последний элемент
  • -2 на предпоследний и т. д.

Индексация и срезы в кортежах

tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
print(tup1[0])
print(tup1[5])
print(tup1[-1])
print(tup1[-9])
# prints
# M
# S
# F
# M

Срезы

Срезы работают так же, как в списках: оператор двоеточие :. Поддерживаются отрицательные индексы.

tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')

# Элементы с index 1 (включительно) до 6 (исключая)
print(tup1[1:6])

# Элементы с начала до index 8 (исключая)
print(tup1[:8])

# Элементы с index 3 до конца
print(tup1[3:])

# Элементы с index -4 (включая) до -1 (исключая)
print(tup1[-4:-1])

# prints
# ('A', 'K', 'E', 'U', 'S')
# ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O')
# ('E', 'U', 'S', 'E', 'O', 'F')
# ('S', 'E', 'O')

Проверка наличия элемента

Ключевое слово in проверяет принадлежность:

tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
if 'M' in tup1:
    print("Да, элемент M присутствует в кортеже")
else:
    print("Элемент не найден в кортеже !!")

# prints
# Да, элемент M присутствует в кортеже

Обновление кортежей

Поскольку кортежи неизменяемы, прямое присваивание элементам невозможно — при попытке Python выдаст TypeError.

tup1 = ('M', 'A', 'K', 'E', 'U', 'S', 'E', 'O', 'F')
tup1[0] = 'Z'

# Следующая ошибка будет выброшена
# TypeError: 'tuple' object does not support item assignment

Важно: неизменяемость — это не баг, а свойство данных: она гарантирует, что содержимое кортежа не будет случайно изменено.

Хак: изменить кортеж через список

Если нужно “обновить” кортеж, преобразуйте его в список, внесите правки и снова преобразуйте в кортеж:

tup1 = (1, 2, 3)
print("Это старый кортеж:")
print(tup1)

temp = list(tup1)
temp[0] = 4
tup1 = tuple(temp)
print("Это обновлённый кортеж:")
print(tup1)

# prints
# Это старый кортеж:
# (1, 2, 3)
# Это обновлённый кортеж:
# (4, 2, 3)

Добавление элементов

Кортежи не поддерживают методы списка, например append(), поэтому для добавления элементов используйте тот же приём через список:

tup1 = (1, 2, 3)
print("Это старый кортеж:")
print(tup1)

temp = list(tup1)
temp.append(4)
tup1 = tuple(temp)
print("Это обновлённый кортеж:")
print(tup1)

# prints
# Это старый кортеж:
# (1, 2, 3)
# Это обновлённый кортеж:
# (1, 2, 3, 4)

Удаление элементов

Нельзя удалить отдельный элемент кортежа напрямую. Удалить весь кортеж можно ключевым словом del:

tup1 = (1, 2, 3)
del tup1

Для удаления элементов используйте преобразование в список, метод remove() и обратное преобразование:

tup1 = (1, 2, 3)
print("Это старый кортеж:")
print(tup1)

temp = list(tup1)
temp.remove(1)
tup1 = tuple(temp)
print("Это обновлённый кортеж:")
print(tup1)

# prints
# Это старый кортеж:
# (1, 2, 3)
# Это обновлённый кортеж:
# (2, 3)

Упаковка и распаковка

Упаковкой называют присвоение набора значений кортежу при создании. Распаковка — извлечение этих значений в отдельные переменные:

# Упаковка
tup1 = (1, 2, 3)

# Распаковка
( one, two, three ) = tup1
print(one)
print(two)
print(three)

# prints
# 1
# 2
# 3

Распаковку удобно применять при возврате нескольких значений из функции.

Перебор элементов

Кортежи итерируемы, поэтому через них легко пройти в цикле.

for цикл

# Перебор for
tup1 = (1, 2, 3)
for element in tup1:
    print(element)

# prints
# 1
# 2
# 3

По индексам

tup1 = (1, 2, 3)
for index in range(len(tup1)):
    print(tup1[index])

# prints
# 1
# 2
# 3

Когда использовать кортежи: преимущества и ограничения

Преимущества:

  • Неизменяемость даёт безопасность при передаче данных между функциями.
  • Меньше накладных расходов по памяти по сравнению со списком в некоторых реализациях.
  • Быстрее при итерации и хешировании (кортежи можно использовать как ключи в dict, если все элементы хешируемы).

Ограничения / когда не использовать:

  • Если нужно часто менять содержимое — лучше список.
  • Если важна гибкость методов (insert, append, extend) — используйте список.
  • Для однородных числовых данных с потребностью в сильной оптимизации по памяти/скорости лучше array или numpy.ndarray.

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

Альтернативы и сравнение

  • Список (list): изменяемый, предпочтителен для динамических последовательностей.
  • namedtuple / collections.namedtuple: кортеж с именованными полями — улучшает читаемость.
  • dataclass (Python 3.7+): для структурированных объектов с возможностью валидации и типов.
  • array / numpy.array: для однородных числовых данных и вычислительных задач.

Таблица-эмпирика (качественно):

  • Безопасность изменений: кортеж > список
  • Скорость доступа: кортеж >= список (зависит от операции)
  • Удобство изменения: список > кортеж

Практическая методология выбора

Шаги при выборе между кортежем и списком:

  1. Определите характер данных: изменяемые или фиксированные? Если фиксированные — рассматривайте кортеж.
  2. Оцените необходимость встроенных методов списков (append, extend): если нужны — выбирайте список.
  3. Нужен ли хешируемый контейнер (для ключа dict или set)? Если да — используйте кортеж с хешируемыми элементами.
  4. Для структурированных записей с именами полей — рассмотрите namedtuple/dataclass.

Ментальные модели и эвристики

  • “Immutable by design”: если вы думаете про данные как про “константу” — используйте кортеж.
  • “Packing as a single unit”: когда нужно передать фиксированный набор значений между компонентами, думайте о кортеже.
  • “Convert when mutating”: если требуется редкое изменение, преобразуйте в список, поправьте, верните в кортеж.

Когда кортежи дают неверное ощущение безопасности

Контрпример: кортеж может содержать изменяемые объекты, например списки. Вложенный список может быть изменён, несмотря на неизменяемость внешнего кортежа. Поэтому неизменяемость поверхностна и не заменяет глубокую иммутабельность.

Чек-листы по ролям

Разработчик:

  • Решите, нужны ли изменения элементов.
  • Подумайте о хешируемости элементов.
  • Используйте явную распаковку для читаемости.

Код-ревьюер:

  • Проверяйте, не модифицируются ли вложенные изменяемые объекты.
  • Убедитесь, что кортеж не используется там, где ожидаются частые модификации.

Аналитик/DS:

  • Для небольших неизменяемых наборов используйте кортежи.
  • Для массивов чисел применяйте numpy для производительности.

Быстрый факт-бокс

  • Кортежи создаются быстрее, чем списки при небольших размерах.
  • Кортежи можно использовать как ключи в словарях, если все элементы хешируемы.
  • Для структурированных записей рассмотрите namedtuple или dataclass.

Диаграмма принятия решения

flowchart TD
  A[Данные неизменяемы?] -->|Да| B[Все элементы хешируемы?]
  A -->|Нет| C[Использовать list]
  B -->|Да| D[Использовать tuple]
  B -->|Нет| E[Рассмотреть namedtuple/dataclass]

Глоссарий в 1 строке

  • Кортеж: неизменяемая последовательность в Python.
  • Распаковка: присвоение элементов контейнера нескольким переменным.
  • namedtuple: кортеж с именованными полями для удобочитаемости.

Тесты и критерии приёмки

Примеры простых тестов, которые можно включить в unit-тесты:

  • Создание кортежа из одного элемента даёт тип tuple.
  • Попытка изменить элемент вызывает TypeError.
  • Преобразование кортежа в список и обратно сохраняет порядок элементов.

Лучшие практики

  • Используйте кортежи для фиксированных записей конфигурации и пар значений (например, координаты).
  • Для возвращаемых функций с несколькими значениями применяйте распаковку для явности.
  • Избегайте вложения изменяемых объектов в кортеж, если вы рассчитываете на полную неизменяемость.

Важно: неизменяемость кортежа не делает автоматически все вложенные объекты неизменяемыми.

Заключение

Кортежи — простой и эффективный инструмент для работы с неизменяемыми наборами данных в Python. Они дают преимущества в скорости и безопасности передачи данных, но не подходят для сценариев, где требуется частая модификация. Применяйте методологию выбора и чек-листы, чтобы принять правильное решение в проекте.

Краткое резюме:

  • Кортежи — для фиксированных наборов данных.
  • Используйте список при необходимости изменений.
  • Для именованных полей — namedtuple или dataclass.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

CSS font-family: как менять шрифты на сайте
Frontend

CSS font-family: как менять шрифты на сайте

График амортизации кредита в Excel — пошагово
Финансы

График амортизации кредита в Excel — пошагово

Разгон Raspberry Pi 4 — безопасный пошаговый гид
Аппаратное обеспечение

Разгон Raspberry Pi 4 — безопасный пошаговый гид

Как запустить Windows 11 на Mac — варианты и советы
Mac

Как запустить Windows 11 на Mac — варианты и советы

Мошенничество с возвратом средств через техподдержку
Безопасность

Мошенничество с возвратом средств через техподдержку

Диагональная обрезка в Canva — как сделать эффектно
Дизайн

Диагональная обрезка в Canva — как сделать эффектно