在此代码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?
这是因为运算符的优先级。你的表达是:
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 中。