2013-04-29 2 views
2

Когда есть некоторые LoopingCall задачи определена в цикле, скрученные Messes обратных вызовов и всегда выполняет последнюю определенноговитой 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.

Забудьте о 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.

Смежные вопросы