Dieser Artikel vermittelt Ihnen relevantes Wissen über den Umfang von Lambda sowie verwandte Inhalte zu Schließungen in Python. Ich hoffe, dass er für alle nützlich ist. helfen.
【Verwandte Empfehlung:
Python3 Video Tutorial】 Python -Verschluss und Lambda Scope
def fun(): for i in range(3): yield lambda x : x * i f0, f1, f2 = fun() print(f0(1), f1(2), f2(3))
closed Writing -Methode
def fun(): result = [] for i in range(3): def demo(x): return x * i result.append(demo) return result f0, f1, f2 = fun() print(f0(1), f1(2), f2(3))
Die Ergebnisse der beiden oben genannten Schreibmethoden sind 2, 4, 6 Nach der ursprünglichen Idee sollte das Ergebnis 0, 2, 6 sein.
Ursache des Problems:Die Wurzel des Problems liegt in den Variablensuchregeln von Python, LEGB (lokal, einschließend, global, bulitin). Im obigen Beispiel liegt i im Abschlussbereich (einschließend) und Pythons Abschluss Das Paket ist spät gebunden und der Wert der im Abschluss verwendeten Variablen i wird gefunden, wenn die interne Funktion aufgerufen wird.
Lösung: Ändern Sie den Abschlussbereich in einen lokalen BereichDas Ausgabeergebnis ist immer noch 2, 4, 6
Ursache des ProblemsDer von der Methode fun() zurückgegebene Generator (oder Iterator) wird nicht tatsächlich ausgeführt, sondern bei jedem Aufruf ausgeführt.
Wenn nach dem Durchlaufen gedruckt wird, verwendet die Variable i den Wert des letzten Aufrufs. Wenn Lambda als Abschlussmethode betrachtet wird, befindet sich der Wert der Variablen i immer noch im Abschlussbereich (nicht lokal).
88
8
88Der Rückgabewert der Erstellungsfunktion ist eine Liste – eine Funktion, die den Eingabeparameter x mit einem Vielfachen i multipliziert. Die erwarteten Ergebnisse waren 0, 2, 4, 6, 8. Das Ergebnis war jedoch 5 und 8, was unerwartet war.
Da bei dieser Falle häufig Lambda verwendet wird, könnte man denken, dass es sich um ein Problem mit Lambda handelt, aber Lambda hat zum Ausdruck gebracht, dass es nicht bereit ist, die Schuld auf sich zu nehmen. Der Kern des Problems liegt in den Attributsuchregeln in Python, LEGB (lokal, einschließend, global, bulitin). Im obigen Beispiel liegt i im Abschlussbereich (einschließend) und Pythons Abschluss ist eine späte Bindung Der Wert der im Abschluss verwendeten Variablen wird beim Aufruf der internen Funktion abgefragt. Die Lösung ist ebenfalls sehr einfach: Ändern Sie den Abschlussbereich in einen lokalen Bereich.
def fun(): for i in range(3): yield lambda x, i = i: x * i f0, f1, f2 = fun() print(f0(1), f1(2), f2(3))
anoother -Art zu schreiben:
def fun(): result = [] for i in range(3): def demo(x, i=i): return x * i result.append(demo) return result f0, f1, f2 = fun() print(f0(1), f1(2), f2(3))
def fun(): for i in range(3): yield lambda x : x * i f0, f1, f2 = fun() print(f0(1), f1(2), f2(3))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 , 17, 18 , 19]Ähnlich nach normaler Logik sollte das Ergebnis sein:
[2, 3, 5, 7, 11, 13, 17, 19]
Die Ursache des Problems :
in Python3 Die Funktion filter () gibt einen Iterator zurück, daher wird sie nicht tatsächlich ausgeführt, sondern bei jedem Aufruf ausgeführt (die von filter () in Python2 zurückgegebene Werteliste weist dieses Phänomen nicht auf )
Ausgeführt nach dem Durchlaufen. Führen Sie nun die Funktion in der Schleife aus. Die i-Variable verwendet den Wert, als sie zuletzt aufgerufen wurde der Wert des eingebetteten Bereichs und dieser Kastanie Der Wert des globalen i wird verwendet
Geänderter Code:
def create(): return [lambda x:i*x for i in range(5)] for i in create(): print(i(2))
[2, 3, 5, 7, 11, 13, 17, 19]
[Verwandte Empfehlungen:
Python3-Video-Tutorial
】
Das obige ist der detaillierte Inhalt vonUmfangsanalyse von Abschlüssen und Lambdas in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!