Подтвердить что ты не робот

Список передачи Python в качестве аргумента

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

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

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

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

4b9b3361

Ответ 1

Все это ссылка в 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)

выходы

['HI']
[]

Ответ 2

Самый простой способ изменить код - добавить [:] к вызову функции.

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



example = list()
function(example[:])
print(example)

Ответ 3

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

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

", хотя я не изменяю непосредственно параметр" example ".

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

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

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

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

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

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

Ответ 4

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