2010-02-23 17 views
22

Wenn ich diesen Code auszuführen war:Python vorbei Liste als Argument

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

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

Warum wäre es zurückkehren [ ‚ja‘], obwohl es nicht direkt die Variable ‚Beispiel‘ bin zu ändern, und wie könnte ich ändern der Code, damit 'Beispiel' nicht von der Funktion beeinflusst wird?

+0

http://effbot.org/zone/default-values.htm beschreibt ein anderes, aber etwas verwandtes Problem. Das Lesen könnte Ihnen helfen zu verstehen, was vor sich geht. – MatrixFrog

Antwort

41

Alles ist eine Referenz in Python. Wenn Sie dieses Verhalten vermeiden möchten, müssen Sie eine neue Kopie des Originals mit list() erstellen. Wenn die Liste mehr Referenzen enthält, müssen Sie 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) 

Ausgänge

['HI'] 
[] 
+3

Sie können auch eine Kopie einer Liste mit 'myList [:]' erstellen. Beachten Sie jedoch, dass dies eine "seichte Kopie" ist, dh das n-te Element der neuen Liste verweist auf dasselbe Objekt wie das n-te Element des alten ein. – MatrixFrog

+0

Guter Punkt, MatrixFrog –

6

verwenden "Warum sollte es zurückgeben ['yes']"

Da Sie die Liste geändert, example.

"obwohl ich die Variable 'example' nicht direkt ändere."

Aber Sie sind, Sie haben das Objekt mit der Variablen example zur Funktion benannt. Die Funktion hat das Objekt mit der Methode append des Objekts geändert.

Wie an anderer Stelle auf SO diskutiert, append erstellt nichts neues. Es ändert ein Objekt an Ort und Stelle.

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

und wie könnte ich den Code ändern, so dass "Beispiel" nicht durch die Funktion beeinflusst wird?

Was meinst du damit? Wenn Sie nicht möchten, dass example von der Funktion aktualisiert wird, übergeben Sie sie nicht an die Funktion.

Wenn die Funktion eine neue Liste erstellen soll, dann schreiben Sie die Funktion, um eine neue Liste zu erstellen.

8

Die einfachste Möglichkeit zum Ändern des Codes ist das Hinzufügen des [:] zum Funktionsaufruf.

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



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

Es ist, weil Sie die Funktion vor dem Drucken der Liste aufgerufen haben. Wenn Sie die Liste drucken, dann die Funktion aufrufen und die Liste erneut drucken, erhalten Sie eine leere Liste gefolgt von der angehängten Version. Es ist in der Reihenfolge Ihres Codes.

Verwandte Themen