`x = [lambda:x for x in range(3)]`,`x [0]()`返回什么?

use*_*627 0 python lambda

在此代码中,x = [x for x in range(3)]全局x等于[0,1,2].

列表推导中的x是局部变量.

然后让我们来定义x = [lambda: x for x in range(3)],将x[0]()返回什么?0?2?

不,它将返回一个列表,全局x本身.

我想知道为什么内部x指的是全局x,而不是局部x?

Ned*_*der 6

这是因为运营商的优先权.你的表达是:

x = [lambda: x for x in range(3)]
Run Code Online (Sandbox Code Playgroud)

这相当于:

x = [(lambda: x) for x in range(3)]
Run Code Online (Sandbox Code Playgroud)

这是三个函数的列表,每个函数都引用全局x.lambda创建一个范围,在Python 2中,在本地范围是全局范围之后检查下一个范围,因此这是找到x的位置.

这让你想要你想要的(我想这就是你想要的):

>>> x = [(lambda x=x: x) for x in range(3)]
>>> x[0]()
0
Run Code Online (Sandbox Code Playgroud)

在这里,我们利用在定义函数时在当前范围内对默认值进行一次计算的事实.这会将x的值烘焙到列表中的每个lambda中.