A ligação do lambda do Python aos valores locais

O seguinte código cospe1 duas vezes, espero ver0 e depois1

<code>def pv(v) :
  print v


def test() :
  value = []
  value.append(0)
  value.append(1)
  x=[]
  for v in value :
    x.append(lambda : pv(v))
  return x

x = test()
for xx in x:
  xx()
</code>

Eu esperava que lambdas de python se ligassem à referência para a qual uma variável local está apontando, atrás da cena. No entanto, isso não parece ser o caso. Eu encontrei este problema em um sistema grande onde o lambda está fazendo equallente de um bind moderno de C ++ ('boost :: bind' por exemplo) onde nesse caso você ligaria a um smart ptr ou copiaria contstruct uma cópia para o lambda.

Então, como faço para vincular uma variável local a uma função lambda e tê-la manter a referência correta quando usado? Estou muito chocado com o comportamento desde que eu não esperava isso de uma linguagem com um coletor de lixo.

O código em questão é o seguinte (l3_e é a variável que está causando o problema):

<code> for category in cat :
      for l2 in cat[category].entries :
        for l3 in cat[category].entries[l2].entry["sub_entries"] :
          l3_e = cat[category].entries[l2].entry["sub_entries"][l3]
          url = "http://forums.heroesofnewerth.com/" + l3_e.entry["url"]
          self.l4_processing_status[l3_e] = 0
          l3_discovery_requests.append( Request(
            url, callback = lambda response : self.parse_l4(response,l3_e)))
          print l3_e.entry["url"]
    return l3_discovery_requests
</code>

questionAnswers(2)

yourAnswerToTheQuestion