← Все вопросы

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

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

def add_item(lst): lst.append(4) lst = [1, 2, 3] return

my_list = [1, 2, 3] add_item(my_list) print(my_list) # Что выведет? Я ожидал, что список останется [1, 2, 3], потому что внутри функции я присваиваю lst = [1, 2, 3]. Но почему-то выводится [1, 2, 3, 4]. Почему? И как сделать так, чтобы функция не меняла исходный список?

1 ответ

0

выведет [1, 2, 3, 4].

тут две разные вещи, которые легко перепутать:

  1. lst.append(4) меняет сам объект, на который смотрит lst. а это тот же самый объект, что и my_list — в питон передаётся ссылка, а не копия. поэтому my_list реально стал [1, 2, 3, 4].
  2. lst = [1, 2, 3] — это НЕ изменение списка, а переприсваивание локального имени lst. ты просто сказал «пусть теперь локальная переменная lst указывает на новый список». на my_list снаружи это никак не влияет — она как смотрела на старый объект, так и смотрит.

то есть append меняет объект (видно снаружи), а lst = ... меняет только то, куда смотрит локальное имя (снаружи не видно). return без значения вообще ничего не отдаёт, вернётся None

Ваш ответ

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