2015-07-15 16 views
10

Ich muss Funktionen in einem Wörterbuch, jede Funktion abhängig von seinem Schlüssel speichern, sagen wir, für einen Schlüssel 1 die Lambda-Funktion zugeordnet ist lambda s: s * A[1]. Ich habe versucht mit dict Verständnis, aber es scheint, dass die Inline-Funktionen endet mit dem letzten Wert der Schleife definiert.Wörterbuch Verständnis mit Inline-Funktionen

d = {k, lambda s: s * A[k] for k in range(n)} # e.g. n = 4 

Danach werden alle mit A[3] erstellt Lambda-Funktionen deklariert werden, statt A[0], A[1], A[2] und A[3]. Was ist mit diesem Code falsch?

+0

zumindest der Druck des Objekts erzeugt wird, ist in der Tat vier Funktionen mit vier Tasten, 0, 1, 2, 3. Der Doc von dict Verständnis sagt, dass dies richtig sein sould ... Ich denke, https: //www.python.org/dev/peps/pep-0274/ –

+0

Nur neugierig, wofür du das benutzt und was wären A und s? – Scott

+6

Es ist eine gemeinsame Sache. http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures – Alik

Antwort

12

Ein Weg, um es zu beheben ist, den Code zu ändern:

d = {k: lambda s, k=k: s * A[k] for k in range(n)} 

Ohne die Bindung, Python sucht die „aktuelle“ k wenn jedes Lambda genannt wird, die immer n-1 im ursprünglichen Code ist.

4

Das Problem tritt auf, weil der Inhalt der Lambda-Funktion nicht ausgeführt wird, bis die Lambda-Funktion ausgeführt wird.

Daher, wenn Sie versuchen, Lambda-Funktion aufzurufen, funktioniert es auf dem neuesten Wert k (wenn Sie del k tun und versuchen, die Lambda-Funktion aufzurufen, sollten Sie einen Fehler erhalten).

Die Antwort von @ YS-L sollte gut für Sie sein.

Eine andere Möglichkeit wäre, den Wert der Wörterbücher zu einer gebundenen Methode zu machen, die den Wert von k bindet. Beispiel -

>>> d = {k:(lambda k,s: s * A[k]).__get__(k) for k in range(n)} 
>>> d 
{0: <bound method int.<lambda> of 0>, 1: <bound method int.<lambda> of 1>, 2: <bound method int.<lambda> of 2>, 3: <bound method int.<lambda> of 3>} 
>>> A 
[1, 2, 3, 4] 
>>> d[0](1) 
1 
>>> d[1](1) 
2 
>>> d[2](1) 
3 
>>> d[3](1) 
4 
Verwandte Themen