Вывод списка после изменения исходного массива

Вывод — [1, 2, 3]. Умножение списка на 1 создаёт новый внешний список, поэтому замена data[0] не меняет new_data.

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

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

Вывод — [1, 2, 3]. Умножение списка на 1 создаёт новый внешний список, поэтому замена data[0] не меняет new_data.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой вывод появится на экране после выполнения приведённого кода. Варианты ответа:

  • [1, 2, 3]
  • [1, 1, 1]
  • [10, 2, 3]
  • [10, 2, 3, 1, 2, 3]
data = [1, 2, 3]
new_data = data * 1
data[0] = 10
print(new_data)

Ответ

Вывод — [1, 2, 3]. Умножение списка на 1 создаёт новый внешний список, поэтому замена data[0] не меняет new_data.

После new_data = data * 1 контейнеры различны, хотя их элементы первоначально совпадают. Присваивание data[0] = 10 заменяет ссылку только в исходном контейнере.

assert data is not new_data
print(data)      # [10, 2, 3]
print(new_data)  # [1, 2, 3]

Копия поверхностная: вложенные изменяемые объекты были бы общими. Например, при data=[[1]] изменение data[0].append(2) отразилось бы и в копии. Для явного выражения намерения обычно используют data.copy() вместо умножения на единицу.

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

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

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

Подробнее