Python lambda de enlace a los valores locales

El siguiente código escupe1 dos veces espero ver0 y entonces1

<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>

Esperaba que las lambdas de pitón se unieran a la referencia a la que apunta una variable local, detrás de la escena. Sin embargo, ese no parece ser el caso. He encontrado este problema en un sistema grande en el que la lambda está realizando el enlace de la versión actual de C ++ ('boost :: bind' por ejemplo) donde, en tal caso, se uniría a un ptr inteligente o la copia contstruct una copia para la lambda.

Entonces, ¿cómo puedo vincular una variable local a una función lambda y hacer que conserve la referencia correcta cuando se utiliza? Estoy bastante atónito con el comportamiento ya que no lo esperaría de un lenguaje con un recolector de basura.

El código en cuestión tiene el siguiente aspecto (l3_e es la variable que está causando el 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>

Respuestas a la pregunta(2)

Su respuesta a la pregunta