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