首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环中定义回调时,扭曲的task.LoopingCall会导致回调混乱

在循环中定义回调时,扭曲的task.LoopingCall会导致回调混乱
EN

Stack Overflow用户
提问于 2013-04-30 01:05:41
回答 1查看 491关注 0票数 2

当在循环中定义了一些LoopingCall任务时,扭曲会扰乱回调,并始终执行最后一个定义的任务

示例代码:

代码语言:javascript
复制
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

没有循环的代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-30 01:51:04

这是由Python中作用域的工作方式决定的。

暂时忘掉Twisted,只考虑这个例子:

代码语言:javascript
复制
x = 1
f1 = lambda: x
x = 2
f2 = lambda: x
print f1()
print f2()

您可能会期望结果是:

代码语言:javascript
复制
1
2

然而,相反,它是:

代码语言:javascript
复制
2
2

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16284313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档