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>