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

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

问题描述:

参数使我在使用延迟函数时扭曲了很多。参数在使用扭曲时在循环中延迟函数

我认为如果函数的参数是一个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

+0

通过我发现 '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

正确的输出我怎样才能像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