Python-Lambda-Closure-Scoping
Das Verhalten von Lambda-Closures in Python zu verstehen, kann schwierig sein. In diesem Artikel untersuchen wir einen Fall, in dem sich eine Lambda-Funktion unerwartet verhält und in allen Fällen den gleichen Wert zurückgibt.
Das Problem:
Bedenken Sie den folgenden Code:
<code class="python">names = ['a', 'b', 'c'] def test_fun(name, x): print(name, x) def gen_clousure(name): return lambda x: test_fun(name, x) funcs1 = [gen_clousure(n) for n in names] funcs2 = [lambda x: test_fun(n, x) for n in names]</code>
Beim Aufruf der Funktionen in funcs1 erhalten wir die erwartete Ausgabe:
a 1 b 1 c 1
Beim Aufruf der Funktionen in funcs2 erhalten wir jedoch ein unerwartetes Ergebnis:
c 1 c 1 c 1
Die erwartete Ausgabe sollte die gleiche sein wie im ersten Fall, aber stattdessen sehen wir für alle Fälle den Wert des Nachnamens „c“.
Die Erklärung:
Der Schlüssel zum Verständnis dieses Verhaltens liegt im Konzept der Schließungen. Abschlüsse in Python ermöglichen inneren Funktionen den Zugriff auf Variablen aus ihren umschließenden Bereichen. Im ersten Fall (funcs1) wird die Lambda-Funktion innerhalb einer Schleife erstellt, aber sie erfasst den Variablennamen aus dem umschließenden Bereich und bindet ihn an den Namen innerhalb der Lambda-Funktion.
Im zweiten Fall (funcs2 ), jedoch verweist die Lambda-Funktion direkt auf die Variable n aus dem umschließenden Bereich, ohne sie an den Namen innerhalb der Lambda-Funktion zu binden. Das bedeutet, dass die Lambda-Funktion beim Aufruf zu diesem Zeitpunkt n auswertet, was immer den letzten Wert aus der Schleife zurückgibt, was zu einer unerwarteten Ausgabe führt.
Das Problem vermeiden:
Um dieses Problem zu vermeiden und das gewünschte Verhalten zu erreichen, müssen wir sicherstellen, dass die Lambda-Funktion die Variable aus dem umschließenden Bereich erfasst und sie an den Namen innerhalb der Lambda-Funktion bindet. Eine Möglichkeit, dies zu tun, besteht darin, die Lambda-Funktion in eine andere Funktion einzuschließen:
<code class="python">def makeFunc(n): return lambda x: x+n</code>
Die resultierende Lambda-Funktion in makeFunc erfasst den Wert von n aus dem umschließenden Bereich und bindet ihn an den Namen innerhalb der Lambda-Funktion. das gewünschte Verhalten erreichen.
Das obige ist der detaillierte Inhalt vonWas verursacht unerwartetes Lambda-Schließverhalten in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!