2010-12-10 15 views
0

Leute vorbei, ich erhielt eine Frage zu dem Übergeben veränderbares Objekts an eine FunktionPython Argument eine Funktion

mit dem folgenden Code, erwarte ich die Ausgabe [0,0,0] sein, während der Ausgang [0,1,2,3]

bedeutet dies, dass das Argument tatsächlich kopiert und dann an das Innere der Funktion gesendet wird?

def lala(a): 
    n = [0, 0 , 0] 
    a = n 

a = [0,1,2,3] 

lala(a) 

print a 

wenn ich die obige aufgabe innerhalb der funktion erfüllen möchte, wie soll ich es elegant schreiben?

vielen Dank!

Antwort

8

Python macht mehr Sinn, wenn Sie denken, Name des Anbringens Tags zu Objekten, anstatt Objekte in benannte Felder zu stopfen.

def lala(a): 
    n = [0, 0 , 0] 
    a = n 

Hier ist, was passiert.

  1. Sie erhalten einen Parameter (in diesem Fall eine Liste) und geben ihm den Namen a.
  2. Sie erstellen eine neue Liste und geben ihr den Namen n.
  3. Sie geben die Liste n den zusätzlichen Namen a.
  4. Beide Namen, a und n, sind lokal für die lala-Funktion, so dass sie "ablaufen", wenn die Funktion endet.
  5. Die Liste, die Sie in der Funktion erstellt haben, hat jetzt keine Namen und Python verwirft sie.

Mit anderen Worten, a ist keine Box, in die Sie eine neue Liste einfügen können. Es ist ein Name, den Sie einer Liste gegeben haben, die Sie erhalten haben. Später weisen Sie diesen Namen der Liste zu, die Sie ebenfalls n genannt haben.

Andere haben eine Slice-Zuweisung vorgeschlagen, a[:] = n, die einen Verweis auf die Elemente in der Liste anstelle der Liste selbst verwendet. Wenn Sie dies tun, zeigt der Name a immer noch auf die gleiche Liste; Der Inhalt wurde gerade ersetzt. Da dieselbe Liste in die Funktion übernommen wurde, "sehen" alle Namen, durch die sie außerhalb der Funktion bekannt sind, den neuen Inhalt.

0

Beachten Sie den Unterschied zwischen Ihrer Funktion, und diese:

def lala(a): 
    a[0] = 7 

a = [0,1,2,3] 
lala(a) 
print a # prints [7, 1, 2, 3] 
1

Das ist, weil eine Funktion neues Label macht „a“ für ihren Anwendungsbereich. Dann überschattet dieses "a" das "a", das Sie außerhalb der Funktion definiert haben. So das neue Label ein auf neues Objekt zugewiesen [0,0,0,0] Wenn Sie schreiben würde:

def lala(a): 
    a.pop() 

a = [0,1,2,3,4] 
lala(a) 
print(a) 

Sie würden, dass a = [0,1,2,3], weil Pop (siehe) ändern Sie das Objekt, auf das das Label 'a' zeigt. (Während der Zuweisung ändern Sie einfach zu dem Objekt, auf das das Label verweist)

2

Sie können a[:] = n innerhalb der Funktion verwenden. Dies wird als Schichtzuordnung bezeichnet.

2

Python verfügt nicht über eine Call-by-Reference-Funktion. Es gibt keinen allgemeinen Weg, dies zu tun.

Wenn Sie Ihr Argument wissen wird eine Liste sein, und Sie wollen, dass es einen anderen Wert nehmen, können Sie es wie so schreiben:

def lala(a): 
    a[:] = [0,0,0] 
3

Kindall bot eine großartige Erklärung meiner Meinung nach, aber meine bevorzugte Methode, um so etwas zu tun, ist die Funktion die Änderung zurückgeben, anstatt mit Referenzen zu verwirren.

def lala(): 
    n = [0, 0, 0] 
    return n 

a = [0, 1, 2, 3] 

a = lala() 

print a # prints [0, 0, 0] 
+0

Ja, das ist eine großartige Ergänzung! – kindall

Verwandte Themen