El siguiente código escupe 1
dos veces, espero ver 0
y luego 1
Python lambda de unión a los valores locales
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()
que esperaba lambdas pitón para unirse a la referencia a una variable local que hace referencia, detrás de la escena. Sin embargo, ese no parece ser el caso. He encontrado este problema en un sistema grande donde el lambda está haciendo el equivalente de C++ moderno de C++ ('boost :: bind' por ejemplo) donde en ese caso se uniría a un ptr inteligente o se copiaría una copia para el lambda.
Entonces, ¿cómo puedo vincular una variable local a una función lambda y hacer que conserve la referencia correcta cuando se usa? Estoy bastante desconcertado con el comportamiento ya que no esperaría esto de un lenguaje con un recolector de basura.
El código en cuestión se ve de la siguiente manera (l3_e es la variable que está causando el problema):
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
He visto varias variantes de esta pregunta. alguien tiene que agregarlos todos, cambiar el título a algo memorable, y luego decirle a Internet que – Shep
ah, aquí va, cerca de duplicados: [lexical-closures-in-python] (http://stackoverflow.com/q/233673/915501) – Shep
Además, el primer fragmento de código ilustra perfectamente tu punto, ¿por qué pegar en este segundo trozo? – Shep