Heim >Backend-Entwicklung >Python-Tutorial >Wie vermeide ich unerwartetes Verhalten in Lambda-Funktionen aufgrund gemeinsam genutzter Bereichsvariablen?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-19 17:25:30291Durchsuche

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>

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!

Stellungnahme:
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