Python lambda& #39;s привязка к локальным значениям

Следующий код выдает 1дважды, я ожидаю увидеть 0, а затем1

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

Я ожидал, что лямбда-выражения Python будут привязываться к ссылке, на которую указывает локальная переменная, за сценой. Однако, похоже, это не так. Я столкнулся с этой проблемой в большой системе, где лямбда-выражение выполняет современный C++ эквивалент привязки ('ускорения ::привязки', например ), где в таком случае вы привязываетесь к умному указателю или копируете конструкцию копия для лямбды.

Итак, как мне привязать локальную переменную к лямбда-функции, чтобы она сохраняла правильную ссылку при использовании? Я совершенно ошеломлен таким поведением, поскольку не ожидал такого от языка со сборщиком мусора.

Рассматриваемый код выглядит следующим образом (l3 _e — переменная, вызывающая проблему):

 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
59
задан Shep 4 May 2012 в 21:58
поделиться