在此代码中,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)]
Run Code Online (Sandbox Code Playgroud)
这相当于:
x = [(lambda: x) for x in range(3)]
Run Code Online (Sandbox Code Playgroud)
这是三个函数的列表,每个函数都引用全局x.lambda创建一个范围,在Python 2中,在本地范围是全局范围之后检查下一个范围,因此这是找到x的位置.
这让你想要你想要的(我想这就是你想要的):
>>> x = [(lambda x=x: x) for x in range(3)]
>>> x[0]()
0
Run Code Online (Sandbox Code Playgroud)
在这里,我们利用在定义函数时在当前范围内对默认值进行一次计算的事实.这会将x的值烘焙到列表中的每个lambda中.
| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |