参数在使用扭曲时在循环中延迟函数
问题描述:
参数使我在使用延迟函数时扭曲了很多。参数在使用扭曲时在循环中延迟函数
我认为如果函数的参数是一个INT值VALUE,或者除了list和dict以外的其他基本类型,它应该传递值而不是引用。
from twisted.internet import defer, reactor
def deferFunc(x):
print "11111 %d" % x
d = defer.Deferred()
reactor.callLater(1, d.callback, x)
return d
@defer.inlineCallbacks
def inlineDeferFunc(x):
print "11111 %d" % x
d = defer.Deferred()
reactor.callLater(1, d.callback, x)
result = yield d
defer.returnValue(result)
def loop():
x = [1,2,3,4]
d = defer.succeed(0)
for i in x:
d.addCallback(lambda _ : inlineDeferFunc(i))
if __name__ == '__main__':
loop()
try:
reactor.run()
except:
reactor.stop()
结果是:
11111 1
11111 4
11111 4
11111 4
,结果搞糊涂了。
我怎样才能像1,2,3,4
答
正确的输出我怎样才能像1,2,3,4
这样正确的输出:
def loop():
x = [1,2,3,4]
d = defer.succeed(0)
for i in x:
d.addCallback(lambda _, i = i : inlineDeferFunc(i))
11111 1
11111 2
11111 3
11111 4
请注意,我们正在复制函数定义i = i
中的值。
的问题是,lambda
抓住家长环境来访问变量i
毕竟它是如何知道哪些价值,对于性能方面的原因,我不认为它复制它的定义中,但父环境不断被更新for
循环。
这里是一个简单的测试。
>>> def test_closures():
... i = 2
... def test():
... return i
... i = 3
... return test
...
>>> test_closures()()
3
+0
谢谢!它必须是** lambda **问题。 – holsety 2012-07-15 03:01:36
通过我发现 'd.addCallback(拉姆达_:inlineDeferFunc(X [0]))的方式\ \t .addCallback(拉姆达_:inlineDeferFunc(X [1]))\ \t。 addCallback(lambda _:inlineDeferFunc(x [2]))\ \t .addCallback(lambda _:inlineDeferFunc(x [3]))\' 这将工作正常。所以我认为这与** for循环有关。 – holsety 2012-07-15 02:38:28