使用扭曲时,在循环中延迟函数的参数

时间:2012-07-15 02:32:19

标签: python twisted

当我使用扭曲的延迟函数时,

参数让我很困惑。

我认为函数的参数是 INT-VALUE ,还是列表和字典之外的其他基本类型,它应该传递值而不是引用。

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 个答案:

答案 0 :(得分:3)

  

如何获得正确的输出,如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
相关问题