2010-02-23 29 views
22

gdybym uruchomić ten kod:Python przechodzącej lista jako argument

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

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

Dlaczego byłoby powrócić [ „yes”], chociaż nie jestem bezpośrednio zmianę zmiennej „przykład”, i jak mogę zmodyfikować kod tak, aby "przykład" nie był wykonywany przez funkcję?

+0

http://effbot.org/zone/default-values.htm opisuje inny, ale nieco pokrewny problem. Czytanie, które może pomóc ci zrozumieć, co się dzieje. – MatrixFrog

Odpowiedz

41

Wszystko jest odniesieniem w języku Python. Jeśli chcesz uniknąć tego zachowania, musisz utworzyć nową kopię oryginału za pomocą list(). Jeśli lista zawiera więcej odniesień, to trzeba użyć 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) 

wyjść

['HI'] 
[] 
+3

Możesz także utworzyć kopię dowolnej listy z 'myList [:]', ale pamiętaj, że jest to "płytka kopia", co oznacza, że ​​n-ty element nowej listy odnosi się do tego samego obiektu co n-ty element starego jeden. – MatrixFrog

+0

Dobrze, MatrixFrog –

6

"Dlaczego byłoby powrócić ['yes']"

Bo zmodyfikował listę, example.

"mimo że nie zmieniam bezpośrednio zmiennej" przykład "."

Ale jesteś, dostarczyłeś obiekt nazwany przez zmienną example do funkcji. Funkcja zmodyfikowała obiekt, korzystając z metody obiektu: append.

Jak to omówiono w innym miejscu na SO, append nie tworzy nic nowego. Modyfikuje obiekt w miejscu.

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

i jak mogę zmodyfikować kod, aby "przykład" nie był wykonywany przez funkcję?

Co przez to rozumiesz? Jeśli nie chcesz, aby funkcja example była aktualizowana, nie przekazuj jej do tej funkcji.

Jeśli chcesz, aby funkcja tworzyła nową listę, zapisz funkcję, aby utworzyć nową listę.

8

Najprostszym sposobem modyfikacji kodu będzie dodanie [:] do wywołania funkcji.

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



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

Jest to spowodowane wywołaniem funkcji przed wydrukowaniem listy. Jeśli wydrukujesz listę, wywołaj funkcję, a następnie wydrukuj listę ponownie, otrzymasz pustą listę, a następnie dołączoną wersję. Jest w porządku twojego kodu.