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>