Вывод — [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() вместо умножения на единицу.