2012-09-08 47 views
0

在此代码中x = [x for x in range(3)]全局x等于[0,1,2]。`x = [范围(3)中的x的x值]`,`x [0]()`会返回什么?

列表理解中的x是一个局部变量。我们定义x = [lambda: x for x in range(3)]x[0]()会返回什么? 0? 2?

不,它会返回一个列表,全局x本身。

我想知道为什么内部x是指全局x,但不是本地x?

+0

你知道在范围(10)] [0]()中有什么'[(lambda:i)'返回,为什么? – delnan

+0

此问题已解决此问题:http://stackoverflow.com/questions/12381793/why-do-these-two-x-refer-to-different-variable – user805627

回答

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中。

相关问题