参数让我很困惑。
我认为函数的参数是 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
答案 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