← Все вопросы

Почему функция изменяет исходный список, хотя я не возвращаю его?

Задан 2 месяца назад5 просмотров1 ответ
0

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 ответ

0

тут 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]. правило простое: не хочешь трогать чужой список — не мутируй аргумент, работай с копией

Ваш ответ

, чтобы ответить на вопрос.