扭曲的task.LoopingCall在循环中定义它们时会混淆回调

时间:2013-04-29 17:05:41

标签: python twisted

当循环中定义了一些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

1 个答案:

答案 0 :(得分:2)

这是范围在Python中的工作原理的结果。

暂时忘掉Twisted并考虑一下这个例子:

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

您可能希望结果为:

1
2

但是,它是:

2
2

f1f2函数都“关闭”同一个变量:x。变量一次只能引用一个对象,在x = 2之后,它引用2 - 而不是1