循环中的函数和 Lambda 创建异常
当尝试在循环内生成函数时,如下面的代码片段所示,出现问题:
functions = [] for i in range(3): def f(): return i functions.append(f)
同样,当使用lambda:
functions = [] for i in range(3): functions.append(lambda: i)
人们期望这些函数输出不同的值(0、1 和 2),但所有函数最终都会产生相同的值 (2)。
解释及解决办法
这种现象是由于变量绑定后期造成的。在Python函数中,变量在调用时解析,这意味着当循环后调用函数时,i的值已经设置为2。为了纠正这个问题,我们通过引入f(i=i)语法来采用早期绑定。在这里,i 参数的默认值是在定义时建立的,从而导致早期绑定:
def f(i=i): return i
或者,使用闭包和“函数工厂”的更复杂的方法可确保早期绑定:好吧:
def make_f(i): def f(): return i return f
在循环中,我们可以使用 f = make_f(i) 而不是 def 语句。
以上是为什么在 Python 循环中创建的函数都返回相同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!