Python `x=[lambda:x代表范围(3)]`,那么`x[0]()`将返回什么?

Python `x=[lambda:x代表范围(3)]`,那么`x[0]()`将返回什么?,python,lambda,Python,Lambda,在此代码中,x=[x代表范围(3)]global x等于[0,1,2] 列表中的x是一个局部变量 然后让我们定义x=[lambda:x代表范围(3)],那么x[0]()将返回什么?0? 二? 不,它将返回一个列表,即全局x本身 我想知道为什么内部x指的是全局x,而不是局部x?这是因为运算符的优先级。你的表达是: x = [lambda: x for x in range(3)] 这相当于: x = [(lambda: x) for x in range(3)] 这是一个包含三个函数的列表,每

在此代码中,
x=[x代表范围(3)]
global x等于[0,1,2]

列表中的x是一个局部变量

然后让我们定义
x=[lambda:x代表范围(3)]
,那么
x[0]()
将返回什么?0? 二?

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


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

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

x = [lambda: x for x in range(3)]
这相当于:

x = [(lambda: x) for x in range(3)]
这是一个包含三个函数的列表,每个函数都指向全局x。lambda创建了一个作用域,在python2中,在局部作用域之后检查的下一个作用域是全局作用域,因此在这里可以找到x

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


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

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

x = [lambda: x for x in range(3)]
这相当于:

x = [(lambda: x) for x in range(3)]
这是一个包含三个函数的列表,每个函数都指向全局x。lambda创建了一个作用域,在python2中,在局部作用域之后检查的下一个作用域是全局作用域,因此在这里可以找到x

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


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

你知道
[(lambda:i)for i in range(10)][0](),
返回了什么,为什么返回?这个问题已经在这篇文章中得到了解决:你知道
[(lambda:i)for i in range(10)][0](),
返回了什么,为什么返回?这个问题已经在这篇文章中得到了解决: