Python lambda綁定到本地值以下代碼吐出1兩次,我期望看到0然后1def pv(v) :
print vdef 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 lambdas綁定到一個(gè)局部變量指向的引用,在場(chǎng)景后面。然而,情況似乎并非如此。我已經(jīng)在一個(gè)大型系統(tǒng)中遇到了這個(gè)問題,其中l(wèi)ambda正在做現(xiàn)代C ++的一個(gè)綁定的等價(jià)物(例如'boost :: bind'),在這種情況下,你將綁定到智能ptr或復(fù)制contstruct lambda的副本。那么,如何將局部變量綁定到lambda函數(shù)并在使用時(shí)保留正確的引用?我對(duì)這種行為非常驚訝,因?yàn)槲也幌M@種語言來自垃圾收集器。有問題的代碼如下所示(l3_e是導(dǎo)致問題的變量): 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
2 回答

繁星點(diǎn)點(diǎn)滴滴
TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
更改x.append(lambda : pv(v))
到x.append(lambda v=v: pv(v))
。
你希望“python lambdas綁定到一個(gè)局部變量指向的引用,在場(chǎng)景后面”,但這不是Python的工作原理。Python在調(diào)用函數(shù)時(shí)查找變量名稱,而不是在創(chuàng)建函數(shù)時(shí)查找。使用默認(rèn)參數(shù)是有效的,因?yàn)槟J(rèn)參數(shù)在創(chuàng)建函數(shù)時(shí)計(jì)算,而不是在調(diào)用函數(shù)時(shí)計(jì)算。
這對(duì)lambdas來說并不特別。考慮:
x = "before foo defined"def foo(): print x x = "after foo was defined"foo()
版畫
after foo was defined
添加回答
舉報(bào)
0/150
提交
取消