Lambdas in Listenverständnissen

Ich wollte eine Liste von Lambdas haben, die als eine Art Cache für einige schwere Berechnungen fungieren, und bemerkte Folgendes:

<code>>>> [j() for j in [lambda:i for i in range(10)]]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
</code>

Obwohl

<code>>>> 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>]
</code>

Dies bedeutet, dass die Lambdas eindeutige Funktionen sind, aber irgendwie alle denselben Indexwert haben.

Ist das ein Fehler oder eine Funktion? Wie vermeide ich dieses Problem? Es ist nicht auf Listenverständnisse beschränkt ...

<code>>>> 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]
</code>

Antworten auf die Frage(5)

Ihre Antwort auf die Frage