2010-02-23 2 views
22

Если бы я запускаю этот код:Python проходит список в качестве аргумента

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

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

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

+0

http://effbot.org/zone/default-values.htm описывает другую, но несколько связанную с этим проблему. Чтение, которое может помочь вам понять, что происходит. – MatrixFrog

ответ

41

Все ссылки на 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'] 
[] 
+3

Вы также можете создать копию любого списка с помощью 'myList [:]', но имейте в виду, что это «мелкая копия», означающая, что n-й элемент нового списка относится к тому же объекту, что и n-й элемент старого один. – MatrixFrog

+0

Хорошая точка, MatrixFrog –

6

"Почему бы это вернуть ['yes']"

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

«хотя я не изменяю непосредственно переменную» пример ».

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

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

См. Why does list.append evaluate to false?, Python append() vs. + operator on lists, why do these give different results?, Python lists append return value.

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

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

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

8

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

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



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

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

Смежные вопросы