Lambdas wewnątrz listy
Chciałem mieć listę lambd, które działają jak pamięć podręczna do jakiegoś ciężkiego obliczenia i zauważyłem to:
<code>>>> [j() for j in [lambda:i for i in range(10)]] [9, 9, 9, 9, 9, 9, 9, 9, 9, 9] </code>
Mimo że
<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>
Oznacza to, że lambdy są unikalnymi funkcjami, ale w jakiś sposób wszystkie mają tę samą wartość indeksu.
Czy jest to błąd lub funkcja? Jak uniknąć tego problemu? Nie ogranicza się do listy wyrażeń ...
<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>