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