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>

questionAnswers(5)

yourAnswerToTheQuestion