Scope of Lambda -Funktionen und deren Parameter
lambda -Funktionen, die in Python als konzipierte anonyme Funktionen vorgestellt wurden, bieten Bequemlichkeit in verschiedenen Szenarien an. Das Verständnis ihres Parameterbereichs kann jedoch von entscheidender Bedeutung sein, um ein unerwartetes Verhalten zu vermeiden. Lassen Sie uns ein gemeinsames Problem untersuchen, das bei der Verwendung von Lambda -Funktionen in Loops entsteht.
Das Problem
Betrachten Sie den folgenden Code, der darauf abzielt, eine Liste von Rückruffunktionen für GUI -Ereignisse zu erstellen:
def callback(msg): print msg # Incorrect approach using an iterator funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) # Correct approach creating one at a time funcList = [] funcList.append(lambda: callback('do')) funcList.append(lambda: callback('re')) funcList.append(lambda: callback('mi')) # Execute the callback functions for f in funcList: f()
Wenn der Code ausgeführt wird, druckt der Code unerwartet:
mi mi mi do re mi
anstelle der erwarteten Ausgabe:
do re mi do re mi
die Erklärung
das Verständnis des Umfangs der Lambda -Funktionen und deren Parameter ist hier von entscheidender Bedeutung. Im Gegensatz zu regulären Funktionen verweisen Lambda -Funktionen auf die Umgebung, in der sie geschaffen werden. Diese Referenz enthält Variablen, die im Körper des Lambdas verwendet werden.
Bei Verwendung eines Iterators im falschen Ansatz für jedes Element M in der Schleife erstellt sie eine neue Lambda -Funktion, die dieselbe Variable m bezieht. Nach Abschluss der Schleife verweist die Variable m jedoch das letzte Element in der Schleife, d. H. "MI". Wenn die Rückruffunktionen ausgeführt werden, drucken sie alle 'mi' die aktualisierte Referenz.
Die Lösung
Um dieses Problem zu beheben, können wir den Wert des Parameters m zum optionalen Parameter erfassen. ('do', 're', 'mi'): funclist.append (lambda m = m: callback (m))
for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m)).
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3