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>

questionAnswers(2)

yourAnswerToTheQuestion