Если я должен был выполнить этот код:
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
Почему это возвратилось бы ['да'] даже при том, что я непосредственно не изменяю переменный 'пример', и как я мог изменить код так, чтобы 'пример' не был произведен функцией?
"Почему она возвращает ['yes']
"
Потому что вы изменили список, example
.
"хотя я не изменяю напрямую переменную 'example'."
Но вы изменяете, вы предоставили объект, названный переменной example
, функции. Функция изменила объект, используя метод append
объекта.
Как обсуждалось в других разделах SO, append
не создает ничего нового. Он изменяет объект на месте.
См. Почему list.append оценивается как false?, Python append() против оператора + в списках, почему они дают разные результаты?, Python lists append return value.
и как я могу изменить код так, чтобы 'example' не был затронут функцией?
Что вы имеете в виду? Если вы не хотите, чтобы example
обновлялся функцией, не передавайте его в функцию.
Если вы хотите, чтобы функция создала новый список, то напишите функцию для создания нового списка.
Все является ссылкой в 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']
[]