Powiązanie lambda Pythona z lokalnymi wartościami
Następujący kod wypluwa1
dwa razy, spodziewam się zobaczyć0
i wtedy1
<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>
Spodziewałem się, że python lambdas będzie wiązał się z odwołaniem, do którego wskazuje lokalna zmienna, za sceną. Jednak tak nie jest. Napotkałem ten problem w dużym systemie, w którym lambda robi współczesny equavalent C ++ powiązania (na przykład „boost :: bind”), gdzie w takim przypadku można by powiązać z inteligentnym ptr lub kopiować konstruować kopię dla lambda.
Jak więc powiązać zmienną lokalną z funkcją lambda i zachować ją podczas używania? Jestem całkiem zaskoczony zachowaniem, ponieważ nie oczekiwałbym tego od języka z garbage collectorem.
Kod ten wygląda następująco (l3_e to zmienna powodująca problem):
<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>