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?
在此代码中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?
这是因为运营商的优先。您的表达式为:
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中。
你知道在范围(10)] [0]()中有什么'[(lambda:i)'返回,为什么? – delnan
此问题已解决此问题:http://stackoverflow.com/questions/12381793/why-do-these-two-x-refer-to-different-variable – user805627