2

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

4

1 回答 1

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-not 1

于 2013-04-29T17:51:03.773 回答