ava*_*sal 14 python lambda closures list-comprehension
使用以下语法读回有关堆栈溢出的问题
In [1]: [lambda: x for x in range(5)][0]()
Out[1]: 4
In [2]: [lambda: x for x in range(5)][2]()
Out[2]: 4
Run Code Online (Sandbox Code Playgroud)
但是我很难理解为什么这个输出恰好是4,我的理解是它总是将列表的最后一个值作为输出,
In [4]: [lambda: x for x in [1,5,7,3]][0]()
Out[4]: 3
Run Code Online (Sandbox Code Playgroud)
但仍然不相信这个语法如何以最后一个值结束.
如果我能对这种语法得到正确的解释,我将非常高兴
Mic*_*ber 15
这不是关于列表推理还是lambdas.这是关于Python中的范围规则.让我们将列表理解重写为等效循环:
funcs = []
for x in range(5):
    def f(): return x
    funcs.append(f)
funcs[0]() # returns 4
Run Code Online (Sandbox Code Playgroud)
在这里,我们可以看到我们连续构造函数并将它们存储在列表中.当调用其中一个函数时,所有发生的事情x都是查找并返回的值.但是x是一个值变化的变量,所以最终值4是总是返回的.您甚至可以更改x循环后的值,例如,
x = 32 
funcs[2]() # returns 32
Run Code Online (Sandbox Code Playgroud)
为了获得您期望的行为,Python需要将for内容作为块进行范围化; 它没有.通常,这不是问题,并且很容易解决.