Lambdas dentro lista compreensões
Eu queria ter uma lista de lambdas que funcionasse como uma espécie de cache para alguma computação pesada e notei isso:
<code>>>> [j() for j in [lambda:i for i in range(10)]] [9, 9, 9, 9, 9, 9, 9, 9, 9, 9] </code>
Apesar
<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>
O que significa que os lambdas são funções únicas, mas de alguma forma todos compartilham o mesmo valor de índice.
isso é um erro ou uma característica? Como evito esse problema? Não está limitado a listar as compreensões ...
<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>