„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 > So vermeiden Sie unerwartete Ergebnisse durch Parameteränderungen in Lambda-Funktionen

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

Veröffentlicht am 18.11.2024
Durchsuche:106

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:

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()

Die erwartete Ausgabe dieses Codes ist:

do
re
mi

Die tatsächliche Ausgabe lautet jedoch:

mi
mi
mi

Das 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 erfassen der Zeitpunkt der Erstellung der Lambda-Funktion, indem er als Standardwert eines optionalen Parameters verwendet wird:

for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))

Dadurch wird sichergestellt, dass jede Lambda-Funktion Zugriff auf ihre eigene Kopie von m hat und den Wert erfasst, der während der Schleifeniteration zugewiesen wurde. Die Ausgabe dieses Codes lautet:

do
re
mi
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729329919 Bei Verstößen 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