Warum erfassen Lambda-Verschlüsse Namen statt Werte?

DDD
Freigeben: 2024-10-21 13:15:30
Original
783 Leute haben es durchsucht

Why Do Lambda Closures Capture Names Instead of Values?

Python Lambda-Abschlussbereich

Beim Versuch, Abschlüsse zu verwenden, um eine Variable aus der Signatur einer Funktion zu entfernen, kann es zu unerwartetem Verhalten kommen. Insbesondere gibt eine Lambda-Funktion, die nicht in einer anderen Funktion eingeschlossen ist, den letzten Wert der Variablen für alle Instanzen zurück.

Um dieses Verhalten zu verstehen, ist es wichtig zu erkennen, dass Abschlüsse Namen und keine Werte erfassen. Wenn Sie ein Lambda als Lambda x: test_fun(n, x) definieren, wird die Variable n nicht innerhalb der Funktion, sondern zum Zeitpunkt des Aufrufs ausgewertet. Folglich ist der angenommene Wert der letzte Wert aus der Schleife.

Um eine Variable mithilfe von Abschlüssen effektiv zu „eliminieren“, muss die Variable als Argument an die Funktion übergeben werden. Dadurch wird der Funktion der aktuelle Wert der Variablen zugewiesen und diese effektiv „gesperrt“. Zum Beispiel:

<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]]  # Bad, captured value is last value
stuff = [lambda x, n=n: n+x for n in [1, 2, 3]]  # Good, n is locked in</code>
Nach dem Login kopieren

Alternativ können Sie zwei verschachtelte Funktionen verwenden:

<code class="python">def makeFunc(n):
    return lambda x: x+n

stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
Nach dem Login kopieren

Hier erfasst das Lambda in makeFunc die lokale n-Variable und nicht die globale. Jeder makeFunc-Aufruf erstellt eine neue lokale Variable und stellt so sicher, dass die zurückgegebenen Lambda-Funktionen eindeutige n Werte haben.

Letztendlich liegt die Wahl zwischen Einfachheit und Flexibilität bei Ihnen. Sie können sich für eine einfachere Funktionserstellung mit einem zusätzlichen Argument in der zurückgegebenen Funktion oder sauberere Funktionen mit einem komplexeren Funktionserstellungsprozess mit zwei verschachtelten Funktionen entscheiden.

Das obige ist der detaillierte Inhalt vonWarum erfassen Lambda-Verschlüsse Namen statt Werte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage