Umfang von Lambda-Funktionen und ihre Parameter
Lambda-Funktionen sind anonyme Funktionen, die den Umfang ihrer umschließenden Funktion erfassen können. Dadurch können sie auf Variablen und Parameter aus dem übergeordneten Bereich zugreifen. Dieses Verhalten kann jedoch manchmal zu unerwarteten Ergebnissen führen, wenn Lambda-Funktionen Parameter verwenden, die innerhalb der einschließenden Funktion geändert wurden.
Um das Problem zu veranschaulichen, betrachten Sie den folgenden 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)) # Calling the lambda functions for f in funcList: f()</code>
Der erwartete Die Ausgabe dieses Codes lautet:
do re mi
Die tatsächliche Ausgabe lautet jedoch:
mi mi mi
Dies liegt daran, dass die Lambda-Funktionen einen Verweis auf die Variable m aus dem umschließenden Bereich erfassen. Wenn der Iterator die Schleife ausführt, weist er m in der letzten Iteration den Wert „mi“ zu. Daher haben alle Lambda-Funktionen bei ihrer Ausführung einen Verweis auf „mi“, auch wenn ihnen bei der Erstellung unterschiedliche Werte übergeben wurden.
Um dieses Problem zu beheben, können Sie den Wert von m at erfassen den Zeitpunkt der Erstellung der Lambda-Funktion, indem er als Standardwert eines optionalen Parameters verwendet wird:
<code class="python">for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))</code>
Dadurch wird sichergestellt, dass jede Lambda-Funktion Zugriff auf ihre eigene Kopie von m hat und den Wert erfasst, der während der Erstellung zugewiesen wurde Schleifeniteration. Die Ausgabe dieses Codes lautet:
do re mi
Das obige ist der detaillierte Inhalt vonSo vermeiden Sie unerwartete Ergebnisse durch Parameteränderungen in Lambda-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!