W3docs

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

Все способы обновления кортежей Python: преобразование в список, конкатенация, срезы, замена значений, добавление и удаление элементов.

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

Почему кортежи неизменяемы

Неизменяемость в Python — это намеренное решение. Кортежи можно использовать в качестве ключей словаря или элементов множества именно потому, что их идентичность никогда не меняется. Попытка изменить кортеж на месте вызывает TypeError:

Прямое присваивание вызывает TypeError

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

Каждая из описанных ниже техник создаёт совершенно новый кортеж, не изменяя исходный.

Преобразование в список

Наиболее читаемый подход для сложных изменений: преобразуйте кортеж в список, выполните все правки, затем преобразуйте обратно.

Преобразование кортежа в список, редактирование и обратное преобразование

python— editable, runs on the server

Вывод:

(1, 2, 6, 4, 5)

Используйте этот подход, когда нужно сделать несколько изменений сразу — например, сортировку, фильтрацию или применение преобразования ко всем элементам, — так как списки поддерживают все операции изменения.

Замена значения с помощью срезов и конкатенации

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

Замена элемента с помощью среза и конкатенации

t = (1, 2, 3, 4, 5)

# Replace the element at index 2 (value 3) with 6
t = t[:2] + (6,) + t[3:]

print(t)

Вывод:

(1, 2, 6, 4, 5)

Срез t[:2] даёт (1, 2), литерал (6,) — это замена (обратите внимание на завершающую запятую — она делает его кортежем), а t[3:] даёт (4, 5). Конкатенация объединяет все три части в новый кортеж.

Замена всех вхождений значения

Используйте выражение-генератор внутри tuple(), чтобы заменить каждое вхождение одного значения другим.

Замена всех вхождений значения в кортеже

t = (1, 2, 2, 3, 2)

# Replace every 2 with 5
t = tuple(5 if x == 2 else x for x in t)

print(t)

Вывод:

(1, 5, 5, 3, 5)

Это более лаконично, чем подход с преобразованием в список, когда единственная цель — замена значения.

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

Добавление в конец

Используйте оператор + для добавления элементов. Правая часть тоже должна быть кортежем — отсюда завершающая запятая в (4,).

Добавление элемента в конец кортежа

t = (1, 2, 3)
t = t + (4,)
print(t)

Вывод:

(1, 2, 3, 4)

Сокращённая форма += работает аналогично:

Расширение кортежа с помощью +=

t = (1, 2, 3)
t += (4, 5)
print(t)

Вывод:

(1, 2, 3, 4, 5)

Примечание: += не изменяет исходный объект-кортеж — Python перепривязывает имя переменной к новому созданному кортежу. Если другая переменная по-прежнему ссылается на исходный кортеж, он остаётся неизменным.

Добавление в начало

Добавление элемента в начало кортежа

t = (1, 2, 3)
t = (0,) + t
print(t)

Вывод:

(0, 1, 2, 3)

Вставка в середину

Для кортежей нет прямого метода insert(). Объедините два среза вокруг нужной позиции:

Вставка элемента на определённую позицию

t = (1, 2, 4, 5)

# Insert 3 at index 2
t = t[:2] + (3,) + t[2:]

print(t)

Вывод:

(1, 2, 3, 4, 5)

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

Удаление по индексу

Используйте срез вокруг индекса, который нужно удалить:

Удаление элемента с индексом 2

t = (1, 2, 3, 4, 5)

# Remove the element at index 2 (value 3)
t = t[:2] + t[3:]

print(t)

Вывод:

(1, 2, 4, 5)

Удаление по значению

Используйте выражение-генератор для фильтрации совпадающих значений:

Удаление всех вхождений конкретного значения

t = ('apple', 'banana', 'cherry', 'banana')

t = tuple(x for x in t if x != 'banana')

print(t)

Вывод:

('apple', 'cherry')

Это удаляет каждое вхождение значения за один проход. Если нужно удалить только первое вхождение, преобразуйте в список, вызовите .remove() и преобразуйте обратно.

Использование распаковки кортежа

Распаковка кортежа в именованные переменные позволяет пересобрать его с изменёнными конкретными позициями. Это наиболее удобно для небольших кортежей, когда нужно понятно назвать части.

Пересборка кортежа через распаковку и переназначение конкретных переменных

t = (1, 2, 3, 4, 5)
a, b, c, d, e = t

# Replace the third element
t = (a, b, 6, d, e)

print(t)

Вывод:

(1, 2, 6, 4, 5)

Избегайте этого подхода для больших кортежей — придётся писать по одной переменной на каждый элемент, что многословно и чревато ошибками.

Ловушка: изменяемые объекты внутри кортежа

Неизменяемость кортежа распространяется только на ссылки, которые он хранит, но не на объекты, на которые эти ссылки указывают. Если кортеж содержит изменяемый объект — например, список — вы можете изменить список, и изменение будет видно через кортеж.

Изменение списка, вложенного в кортеж

t = ([1, 2], [3, 4])

# The tuple itself is immutable, but its elements (lists) are not
t[0].append(5)

print(t)

Вывод:

([1, 2, 5], [3, 4])

Кортеж по-прежнему хранит те же две ссылки на списки — эта часть неизменна. Но объект-список, на который указывает t[0], был изменён. Это частый источник путаницы при использовании кортежей в качестве ключей словаря: хешируемы только полностью неизменяемые кортежи (не содержащие списков, словарей и других изменяемых объектов).

Выбор подходящего метода

ЦельРекомендуемый метод
Изменить один элемент по индексуСрез + конкатенация
Заменить все вхождения значенияВыражение-генератор внутри tuple()
Несколько изменений сразуПреобразовать в список, отредактировать, преобразовать обратно
Добавить элементы в конецОператор + или +=
Удалить элемент по индексуСрез вокруг индекса
Удалить элемент по значениюВыражение-генератор с условием if
Небольшой кортеж с понятными позициямиРаспаковка в именованные переменные и пересборка

Подробнее о работе с кортежами: Доступ к кортежам, Распаковка кортежей, Перебор кортежей и Методы кортежей.

Практика

Практика
Какое из следующих утверждений об обновлении кортежей в Python верно?
Какое из следующих утверждений об обновлении кортежей в Python верно?
Was this page helpful?