2013-04-29 136 views
2

定義當有在循環中定義一些LoopingCall任務,扭曲混亂回調和總是執行最後一個定義扭曲task.LoopingCall弄亂回調當它們在循環

示例代碼:

from twisted.internet import reactor, task 
from pprint import pprint 

for s in [1,2]: 
    task.LoopingCall(lambda: pprint(s)).start(1) 

reactor.run() 

響應: 1 2 2 2 2 2

代碼,而無需環路的工作原理:

from twisted.internet import reactor, task 
from pprint import pprint 

task.LoopingCall(lambda: pprint(1)).start(1) 
task.LoopingCall(lambda: pprint(2)).start(1) 

reactor.run() 

正確答案:1 2 1 2 1 2

回答

2

這是Python範圍如何工作的結果。

忘掉扭曲了片刻,只考慮這個例子:

x = 1 
f1 = lambda: x 
x = 2 
f2 = lambda: x 
print f1() 
print f2() 

你可能希望得到的結果是:

1 
2 

但是,相反,它是:

2 
2 

f1f2功能「關閉」相同的v ariable:x。變量一次只能引用一個對象,在x = 2之後,它指的是2 - 而不是1