← Назад к вопросам

Поменяется ли значение при использовании append, если вызывать список из кортежа

1.6 Junior🔥 141 комментариев
#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Да, значение изменится при использовании append

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

Пример демонстрации проблемы

my_list = [1, 2, 3]
my_tuple = (my_list, "text")
print(my_tuple)
my_list.append(4)
print(my_tuple)
print(my_list)

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

Почему это происходит?

Кортежи неизменяемы на уровне своей структуры — нельзя добавлять или удалять элементы из кортежа. Однако, если элемент кортежа — это изменяемый объект (список, словарь, множество), то сам этот объект может быть изменен:

my_tuple = ([1, 2], "text")
my_tuple[0].append(3)
print(my_tuple)

Визуализация через объекты и ссылки

my_list = [1, 2, 3]
my_tuple = (my_list, "text")
my_list.append(4)
print(my_tuple[0])

Кортеж содержит ССЫЛКУ на список, не копию.

Как избежать этой проблемы?

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

my_list = [1, 2, 3]
my_tuple = (my_list[:], "text")
my_list.append(4)
print(my_tuple)

import copy
my_tuple = (copy.copy(my_list), "text")

my_tuple = (tuple(my_list), "text")
my_list.append(4)
print(my_tuple)

Правила Python для типов данных

  • Неизменяемые (immutable): int, float, str, bool, tuple, frozenset, bytes
  • Изменяемые (mutable): list, dict, set, bytearray

Вывод

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