Привязка Python к локальным значениям
Следующий код выплевывает1
дважды, я ожидаю увидеть0
а потом1
<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>
Я ожидал, что python-лямбды будут привязываться к ссылке, на которую указывает локальная переменная, за сценой. Однако, похоже, это не так. Я столкнулся с этой проблемой в большой системе, где лямбда выполняет современный C ++ эквивалент эквивалента связывания (например, «boost :: bind»), где в таком случае вы будете привязываться к интеллектуальному ptr или копировать contstruct. копия для лямбды.
Итак, как мне связать локальную переменную с лямбда-функцией и сохранить ли она правильную ссылку при использовании? Я совершенно ошеломлен таким поведением, так как не ожидал бы этого от языка с сборщиком мусора.
Рассматриваемый код выглядит следующим образом (l3_e - это переменная, вызывающая проблему):
<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>