Особенности присваивания списков в Python

Выведется [1, 2, 3, 4, 5]. Присваивание bar = foo копирует ссылку на список, а не создаёт новый список.

Короткий ответ

Что ответить на собеседовании

Выведется [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 с другим объектом. Различие между мутацией и перепривязкой имени объясняет поведение примера.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее