Вопрос проверяет понимание модели передачи аргументов и работы с объектами в Python.
В Python в функцию передается ссылка на объект, а не копия. Если объект изменяемый, функция может изменить его состояние. Эти изменения будут видны снаружи функции. Это называется побочным эффектом.
Python использует передачу ссылки на объект.
Это означает:
переменная хранит ссылку
функция получает ту же ссылку
def add_item(lst):
lst.append(1)
data = []
add_item(data)
print(data) # [1]
Функция изменила исходный список.
Список — изменяемый объект.
Изменяемые типы:
list
dict
set
Неизменяемые:
int
str
tuple
Проблемы возникают:
при скрытых побочных эффектах
при работе с кэшем
при многопоточности
Делать копию:
def func(lst):
lst = lst.copy()
Использовать неизменяемые структуры
Документировать поведение функции
Изменения происходят, потому что функции работают с тем же объектом, а не его копией.