Über den Python-Abschluss

7

Unten ist ein Beispiel, das ich von jemandes Blog über Python-Schließung bekommen habe. Ich führe es in Python 2.7 und bekomme eine andere Ausgabe als erwartet.

%Vor%

Meine erwartete Ausgabe ist: 0, 2, 4
Aber die Ausgabe ist: 4, 4, 4
Gibt es jemanden, der es erklären könnte?
Vielen Dank im Voraus.

    
Alex.Zhang 10.07.2012, 07:28
quelle

3 Antworten

16

Schleifen führen in Python keinen Bereich ein, daher schließen sich alle drei Funktionen über die gleiche i Variable und beziehen sich auf den letzten Wert, nachdem die Schleife beendet ist, was 2 ist.

Es scheint so, als ob fast jeder, mit dem ich rede, der Closures in Python benutzt, davon gebissen wurde. Die logische Folge ist, dass die äußere Funktion i ändern kann, aber die innere Funktion nicht (da dies i zu einer lokalen statt einer Schließung machen würde, basierend auf Pythons syntaktischen Regeln).

Es gibt zwei Möglichkeiten, dies zu beheben:

%Vor%     
Walter Mundt 10.07.2012, 07:33
quelle
4

Sie erstellen keine Schließungen. Sie erzeugen eine Liste von Funktionen, die jeweils auf die globale Variable i zugreifen, die nach der ersten Schleife gleich 2 ist. Sie erhalten also für jeden Funktionsaufruf 2 * 2.

    
mhawke 10.07.2012 07:31
quelle
1

Jede Funktion greift auf das globale i zu.

functools.partial kommt zur Rettung:

%Vor%     
Matthias 10.07.2012 07:35
quelle

Tags und Links