„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie vermeiden Sie ein unerwartetes Verhalten im Lambda -Funktionsumfang und im Parameter in Schleifen?

Wie vermeiden Sie ein unerwartetes Verhalten im Lambda -Funktionsumfang und im Parameter in Schleifen?

Gepostet am 2025-03-24
Durchsuche:705

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops?

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))
.
Freigabeerklärung Dieser Artikel wird reproduziert unter: 1729329977 Wenn ein Verstoß vorliegt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

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