了解在循环或推导式中创建函数时的后期绑定
尝试在循环中创建函数时,您可能会遇到以下情况:尽管期望输出不同,但所有函数都返回相同的值。出现此行为的原因是后期绑定,其中变量的值在执行时解析。
Python 的后期绑定
在 Python 中,函数和 lambda 可以通过执行时默认绑定变量。这意味着调用函数时会查找其中使用的任何变量。在循环中,循环迭代器 i 稍后会被解析,到那时,它会引用循环后 i 的最终值。
例如,在以下代码片段中:
functions = [] for i in range(3): def f(): return i functions.append(f)
函数列表中的所有函数都引用相同的 i 值,循环结束后 i 为 2。
强制提前执行绑定
要解决此问题,您需要强制早期绑定,这确保 i 的值在函数定义时绑定。实现此目的的一种方法是使用参数的默认值,如下所示:
functions = [] for i in range(3): def f(i=i): return i functions.append(f)
通过为 i 参数提供默认值,可以强制执行早期绑定。传递给 f 函数的 i 值在函数定义时解析,而不是在函数执行时解析。
使用函数工厂
另一种方法是使用函数工厂来创建具有所需绑定的函数。这涉及创建一个附加函数,该函数接受要绑定的变量并返回带有早期绑定变量的嵌套函数:
def make_f(i): def f(): return i return f
在循环中,您可以使用 f = make_f(i) 来创建具有适当的早期绑定的函数。
以上是为什么 Python 循环中的函数都返回相同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!