Можно ли в Python изменить список, находящийся внутри кортежа (tuple)

«Можно ли в Python изменить список, находящийся внутри кортежа (tuple)» — вопрос из категории Python, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Это демонстрирует ключевое различие между изменяемостью самого контейнера и изменяемостью его элементов.

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

Однако, если один из этих объектов является изменяемым (mutable), например, список (list), то его внутреннее состояние можно изменить.

Пример:

# Кортеж содержит число, строку и список
my_tuple = (1, "hello", [3, 4])

# Попытка изменить сам кортеж вызовет ошибку
# my_tuple[0] = 99  # -> TypeError: 'tuple' object does not support item assignment

# Но мы можем изменить изменяемый элемент (список) внутри кортежа
print(f"Кортеж до изменения: {my_tuple}")
# -> Кортеж до изменения: (1, 'hello', [3, 4])

my_tuple[2].append(5)
my_tuple[2][0] = 99

print(f"Кортеж после изменения: {my_tuple}")
# -> Кортеж после изменения: (1, 'hello', [99, 4, 5])

Почему так происходит? Кортеж хранит ссылку на объект списка. Сама ссылка неизменна, но объект, на который она указывает, можно модифицировать.

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