当循环中定义了一些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
答案 0 :(得分:2)
这是范围在Python中的工作原理的结果。
暂时忘掉Twisted并考虑一下这个例子:
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
。