Почему функция изменяет исходный список, хотя я не возвращаю его?
def add_item(lst): lst.append(99) return lst
my_list = [1, 2, 3] new_list = add_item(my_list) print(my_list) # [1, 2, 3, 99] — изменился! print(new_list) # [1, 2, 3, 99] Я ожидал, что my_list останется [1, 2, 3], а new_list будет [1, 2, 3, 99]. Почему изменился исходный список? Как сделать так, чтобы функция не трогала оригинальный список?
1 ответ
тут lst, my_list и new_list — это три имени для ОДНОГО и того же списка. в питон передаётся ссылка, а не копия: append(99) меняет этот единственный объект на месте, а return lst возвращает его же. поэтому и my_list, и new_list показывают одно — [1, 2, 3, 99].
если хочешь, чтобы оригинал остался нетронутым, а функция вернула новый список — делай копию внутри:
def add_item(lst):
lst = lst.copy() # или list(lst)
lst.append(99)
return lst
теперь my_list останется [1, 2, 3], а new_list будет [1, 2, 3, 99]. правило простое: не хочешь трогать чужой список — не мутируй аргумент, работай с копией