Python twisted task.LoopingCall在循环中定义回调时会弄乱回调

Python twisted task.LoopingCall在循环中定义回调时会弄乱回调,python,twisted,Python,Twisted,当循环中定义了一些LoopingCall任务时,twisted会处理回调并始终执行最后定义的一个 示例代码: from twisted.internet import reactor, task from pprint import pprint for s in [1,2]: task.LoopingCall(lambda: pprint(s)).start(1) reactor.run() 答复:12 没有循环的代码: from twisted.internet import re

当循环中定义了一些LoopingCall任务时,twisted会处理回调并始终执行最后定义的一个

示例代码:

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

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

reactor.run()
答复:
12

没有循环的代码:

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()

回答正确:
12

这是Python中作用域工作方式的结果

<>忘记扭曲一下,只考虑这个例子:

x = 1
f1 = lambda: x
x = 2
f2 = lambda: x
print f1()
print f2()
您可能期望结果是:

1
2
然而,它是:

2
2
f1
f2
都可以“关闭”相同的变量:
x
。变量一次只能引用一个对象,在
x=2
之后,它引用
2
-而不是
1