【发布时间】:2017-12-02 10:48:51
【问题描述】:
我试图用函数来理解 python 作用域。跟随 sn-p 给了我一个意想不到的结果。
def foo(val):
return val*val
flist = []
for i in range(3):
flist.append(lambda : foo(i))
def bar1():
for j in range(3,6):
flist.append(lambda : foo(j))
def bar2():
for k in range(6,9):
a = lambda n: (lambda:foo(n))
flist.append(a(k))
bar1()
bar2()
print([f() for f in flist])
预期结果是:
[0, 1, 4, 9, 16, 25, 36, 49, 64]
但是得到了:
[4, 4, 4, 25, 25, 25, 36, 49, 64]
相反。在前两种情况下,循环变量的最后一个值被传递给foo 函数。这段代码是如何工作的?
【问题讨论】:
-
您能解释一下您是如何达到预期结果的吗?
-
您的
flist的前 6 个值包含lambdas。当您调用f()在哪个阶段i==2和j==5即4s 和25s 时评估这些。在bar2上,在我看来a(k)返回一个lambda,其中n已经设置......(所以你实际上是在附加lambda: foo(6), lambda: foo(7), ...)。但是,不确定这是如何解释的......
标签: python function lambda scope