ahu*_*ura 13 python python-3.x
我想编写一个返回函数列表的函数.作为一个MWE,这是我的函数尝试,它给出了三个函数,它们将0,1和2添加到输入数字:
def foo():
result = []
for i in range(3):
temp = lambda x: x + i
print(temp(42)) # prints 42, 43, 44
result.append(temp)
return result
for f in foo():
print(f(42)) #prints 44, 44, 44
Run Code Online (Sandbox Code Playgroud)
与我的期望相反,每个函数最终使用i的最后一个值.当我将一个列表用作函数的参数但Python实际上使用指向列表的指针时,我经历过类似的行为,但这里我是一个整数,所以我不明白这里发生了什么.我正在运行Python 3.5.
Jim*_*ard 15
闭包绑定较晚,这意味着它们将使用i调用时定义的范围中的最后一个值(在这种情况下,i将是最后一个值2).
对此的常见解决方案是提供i作为默认参数的值:
temp = lambda x, i=i: x + i
Run Code Online (Sandbox Code Playgroud)
由于Python在构造函数期间评估默认参数,这是一个技巧,可以帮助Python i在调用callable时使用正确的值,它不会创建一个闭包,而是可以查找i它的本地.
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |