0

在此代码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?

4

1 回答 1

6

这是因为运算符的优先级。你的表达是:

x = [lambda: x for x in range(3)]

这相当于:

x = [(lambda: x) for x in range(3)]

这是三个函数的列表,每个函数都引用全局 x。lambda 创建了一个作用域,在 Python 2 中,在局部作用域之后检查的下一个作用域是全局作用域,所以这就是 x 所在的位置。

这给了你想要的(我认为这就是你想要的):

>>> x = [(lambda x=x: x) for x in range(3)]
>>> x[0]()
0

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

于 2012-09-08T16:40:29.607 回答