Bereichsverhalten von Lambda-Funktionen und ihren Parametern
Wenn eine Lambda-Funktion erstellt wird, erbt sie den Bereich ihrer umschließenden Funktion. Bei der Verwendung von Iteratorschleifen zum Generieren einer Reihe von Lambda-Funktionen kommt es jedoch zu einem häufigen Missverständnis. In solchen Fällen nutzen die Lambda-Funktionen dieselbe Bereichsvariable, was zu unerwarteten Ergebnissen führt.
Betrachten Sie den folgenden vereinfachten Code:
<code class="python">def callback(msg): print msg # Creating a list of function handles with an iterator funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) # Executing the functions for f in funcList: f()</code>
Die erwartete Ausgabe ist:
do re mi
Die tatsächliche Ausgabe lautet jedoch:
mi mi mi
Dies geschieht, weil die Lambda-Funktion beim Erstellen einen Verweis auf die gemeinsam genutzte Variable m im umschließenden Bereich beibehält. Zum Zeitpunkt der Ausführung der Lambda-Funktionen wurde m bereits „mi“ zugewiesen, was zu der unerwarteten Ausgabe führte.
Um dieses Problem zu beheben, kann man einen optionalen Parameter mit einem Standardwert verwenden. Dadurch kann jede Lambda-Funktion ihren eigenen Wert der Variablen erfassen:
<code class="python">for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))</code>
Mit dieser Modifikation behält jede Lambda-Funktion zum Zeitpunkt ihrer Erstellung eine eindeutige Kopie des Werts von m bei und liefert so die gewünschte Ausgabe :
do re mi
Das obige ist der detaillierte Inhalt vonWie vermeide ich unerwartetes Verhalten in Lambda-Funktionen aufgrund gemeinsam genutzter Bereichsvariablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!