Python, передающий список как аргумент

Если я должен был выполнить этот код:

def function(y):
    y.append('yes')
    return y

example = list()
function(example)
print(example)

Почему это возвратилось бы ['да'] даже при том, что я непосредственно не изменяю переменный 'пример', и как я мог изменить код так, чтобы 'пример' не был произведен функцией?

23
задан S.Lott 23 February 2010 в 22:00
поделиться

2 ответа

"Почему она возвращает ['yes']"

Потому что вы изменили список, example.

"хотя я не изменяю напрямую переменную 'example'."

Но вы изменяете, вы предоставили объект, названный переменной example, функции. Функция изменила объект, используя метод append объекта.

Как обсуждалось в других разделах SO, append не создает ничего нового. Он изменяет объект на месте.

См. Почему list.append оценивается как false?, Python append() против оператора + в списках, почему они дают разные результаты?, Python lists append return value.

и как я могу изменить код так, чтобы 'example' не был затронут функцией?

Что вы имеете в виду? Если вы не хотите, чтобы example обновлялся функцией, не передавайте его в функцию.

Если вы хотите, чтобы функция создала новый список, то напишите функцию для создания нового списка.

8
ответ дан 29 November 2019 в 01:08
поделиться

Все является ссылкой в ​​Python. Если вы хотите избежать такого поведения, вам придется создать новую копию оригинала с помощью list () . Если список содержит больше ссылок, вам нужно будет использовать deepcopy ()

def modify(l):
 l.append('HI')
 return l

def preserve(l):
 t = list(l)
 t.append('HI')
 return t

example = list()
modify(example)
print(example)

example = list()
preserve(example)
print(example)

output

['HI']
[]
45
ответ дан 29 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: