Wie vermeide ich unerwartetes Verhalten in Lambda-Funktionen aufgrund gemeinsam genutzter Bereichsvariablen?

Barbara Streisand
Freigeben: 2024-10-19 17:25:30
Original
166 Leute haben es durchsucht

How to Avoid Unexpected Behavior in Lambda Functions Due to Shared Scope Variables?

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

Die erwartete Ausgabe ist:

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

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

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!