Python Lambda in einer Schleife
Unter Berücksichtigung der folgenden code-snippet :
# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
self.command["cd " + d] = (lambda : self.root.change_directory(d))
Ich erwarten, erstellen Sie ein Wörterbuch für zwei-Funktion wie folgt :
# Expected :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("home")
}
aber es sieht aus wie die beiden lambda-Funktion erzeugt werden, sind genau die gleichen :
# Result :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("login") # <- Why login ?
}
Ich verstehe wirklich nicht, warum. Haben Sie irgendwelche Vorschläge ?
InformationsquelleAutor FunkySayu | 2013-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie binden d für jede Funktion erstellt. Ein Weg das zu tun ist, übergeben Sie es als parameter mit einem default-Wert:
Nun das d in der Funktion den parameter verwendet, obwohl es den gleichen Namen hat, und der Standardwert ist, der ausgewertet wird, wenn die Funktion erstellt wird. Zu helfen, sehen Sie dies:
Daran erinnern, wie default-Werten arbeiten, wie für veränderliche Objekte wie Listen und dicts, weil Sie ein Objekt binden.
Diesem idiom der Parameter mit default-Werten ist Häufig genug, aber kann fehlschlagen, wenn Sie die Introspektion-Funktion Parameter, und bestimmen, was zu tun ist basierend auf Ihre Anwesenheit. Sie können vermeiden, den parameter mit einem anderen Verschluss:
command = lambda path = path: selected(path)
.InformationsquelleAutor Roger Pate
Dies ist wegen der Punkt, an dem d gebunden ist. Die lambda-Funktionen, die alle Punkt, an dem variable
d
eher als die aktuelle Wert, also, wenn Sie ein updated
in der nächsten iteration dieses update ist in allen Ihren Funktionen.Für ein einfacheres Beispiel:
Dies können Sie umgehen, indem Sie eine zusätzliche Funktion, etwa so:
Können Sie auch fix die Bereiche innerhalb des lambda-Ausdrucks
Jedoch ist dies im Allgemeinen nicht gute Praxis, wie Sie sich geändert haben die Unterschrift Ihrer Funktion.
InformationsquelleAutor robbie_c
Traf ich das gleiche problem. Die gewählte Lösung hat mir geholfen, eine Menge, aber die halte ich für notwendig, um eine Präzision, um funktionelle code der Frage: definieren Sie eine lambda-Funktion außerhalb der Schleife. Durch die Möglichkeit, default-Wert ist nicht notwendig.
InformationsquelleAutor MonsterBat Doppelgänger