So vermeiden Sie unerwartete Ergebnisse durch Parameteränderungen in Lambda-Funktionen

Patricia Arquette
Freigeben: 2024-10-19 17:28:01
Original
780 Leute haben es durchsucht

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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>
Nach dem Login kopieren

Der erwartete Die Ausgabe dieses Codes lautet:

do
re
mi
Nach dem Login kopieren
Nach dem Login kopieren

Die tatsächliche Ausgabe lautet jedoch:

mi
mi
mi
Nach dem Login kopieren

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>
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage