异步执行时变量共享(python)

上一篇,我们看了C#与javascript中的异步执行时的变量共享以及解决的办法,接下来看一下python中的情况,我们制造一个返回lambda列表,然后再依次执行列表中的lambda:

import sys
ls = [(lambda : sys.stdout.write(str(i))) for i in range(5)]
for f in ls:f()

可看到输出的是5个4,情况同C#与javascript一样,变量i被共享了。其实也是作用域的问题,返回列表中每个lambda实例都闭包引用了i这个变量,可以通过再封装一个lambda的方式,将变量通过参数传入的方式,以解决这个问题:

ls = [(lambda j: lambda : sys.stdout.write(str(j)))(i) for i in range(5)]
for f in ls:f()

输出了0~4,是期望的结果。这种解决办法其实与上一篇中的javascript的解决思路大同小异。如果函数列表只需执行一次,我们其实还可以使用生成器的方式来解决这个问题:

ls = ((lambda : sys.stdout.write(str(i))) for i in range(5))
for f in ls:f()
posted @ 2011-03-18 11:05  他山之石_  阅读(977)  评论(0编辑  收藏  举报