2013-04-29 138 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