alias = source не копирует список: оба имени ссылаются на один изменяемый объект. Поэтому alias.append(5) меняет объект, который затем выводится и через source.
Почему изменение одного списка меняет другой: детали присваивания в Python
alias = source не копирует список: оба имени ссылаются на один изменяемый объект. Поэтому alias.append(5) меняет объект, который затем выводится и через source.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этом задании нужно разобраться, как происходит присваивание списков в Python и почему после изменения одного списка меняется и другой. Рассмотрите следующий пример и объясните, что происходит на уровне ссылок и изменяемых объектов.
source = [1, 2, 3, 4]
alias = source
alias.append(5)
print(source)
Опишите, как Python обрабатывает переменные, какие объекты создаются, почему source выводит [1, 2, 3, 4, 5], и чем отличается простое копирование от создания независимого списка.
Ответ
alias = source не копирует список: оба имени ссылаются на один изменяемый объект. Поэтому alias.append(5) меняет объект, который затем выводится и через source.
Будет напечатано [1, 2, 3, 4, 5]. Новый список при присваивании не создаётся:
print(alias is source) # True
Для независимого внешнего контейнера используйте alias = source.copy() или source[:]. Это поверхностные копии: вложенные объекты остаются общими. Если нужно независимо изменять вложенные списки и словари, рассмотрите copy.deepcopy, учитывая особенности копируемых объектов. Перепривязка alias к другому списку не меняет source.