Список передачи Python в качестве аргумента - PullRequest
22 голосов
/ 24 февраля 2010

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

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

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

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

Ответы [ 4 ]

42 голосов
/ 24 февраля 2010

Все ссылки на 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']
[]
9 голосов
/ 16 июля 2013

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

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



example = list()
function(example[:])
print(example)
8 голосов
/ 24 февраля 2010

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

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

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

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

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

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

и как я могу изменить код, чтобы функция «example» не влияла на функцию?

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

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

0 голосов
/ 22 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...