Ich wollte eine Liste von Lambda-Ausdrücke haben, die als eine Art von Cache zu einigen schweren Berechnung handeln und bemerkte dies:Lambdas innerhalb Listenkomprehensionen
>>> [j() for j in [lambda:i for i in range(10)]]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Obwohl
>>> list([lambda:i for i in range(10)])
[<function <lambda> at 0xb6f9d1ec>, <function <lambda> at 0xb6f9d22c>, <function <lambda> at 0xb6f9d26c>, <function <lambda> at 0xb6f9d2ac>, <function <lambda> at 0xb6f9d2ec>, <function <lambda> at 0xb6f9d32c>, <function <lambda> at 0xb6f9d36c>, <function <lambda> at 0xb6f9d3ac>, <function <lambda> at 0xb6f9d3ec>, <function <lambda> at 0xb6f9d42c>]
Bedeutung, dass die Lambda-Ausdrücke sind eindeutige Funktionen, aber sie haben alle den gleichen Indexwert.
Ist das ein Fehler oder eine Funktion? Wie vermeide ich dieses Problem? Es ist nicht zu Listenkomprehensionen begrenzt ...
>>> funcs = []
... for i in range(10):
... funcs.append(lambda:i)
... [j() for j in funcs]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Der erste Ansatz funktioniert nicht so gut, wenn Sie möchten, dass Ihr 'Lambda'' * args' 'unterstützt. Der zweite Ansatz wird dort funktionieren, ist aber ... mehr Arbeit :) –
Schade, ich kann nicht beide Antworten grün markieren. Ich wählte dieses, weil es tatsächlich den richtigen Code zum Ausschneiden und Einfügen gab, wie ich fünf bin, und ich mag diese Annäherung an Antworten auf SO. – ubershmekel
Für diejenigen von uns weniger gut in Python, jede Chance, Sie könnten eine andere Variable als "i" für eine der Instanzen in der ersten Annäherung verwenden? – Chowlett