我正在运行Python 3.4.2,我对代码的行为感到困惑.我正在尝试创建一个可调用多项式函数列表,其程度越来越高:
bases = [lambda x: x**i for i in range(3)]
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,它做到了这一点:
print([b(5) for b in bases])
# [25, 25, 25]
Run Code Online (Sandbox Code Playgroud)
为什么bases看起来似乎是列表理解中最后一个lambda表达式的列表,重复?
unu*_*tbu 22
这个问题是一个经典的"问题",就是i在调用lambda函数之前,不会查找 lambda函数中引用的问题.那时,值i是for-loop结束时绑定的最后一个值,即2.
如果绑定i到lambda函数定义中的默认值,则每个都i成为局部变量,并且在定义 lambda 而不是调用lambda时,会计算其默认值并绑定到函数.
因此,当调用lambda时,i现在在本地范围内查找,并使用其默认值:
In [177]: bases = [lambda x, i=i: x**i for i in range(3)]
In [178]: print([b(5) for b in bases])
[1, 5, 25]
Run Code Online (Sandbox Code Playgroud)
以供参考:
| 归档时间: |
|
| 查看次数: |
2819 次 |
| 最近记录: |