Python循环定义函数后变量值异常,如何实现预期顺序输出?
Python循环中定义函数的闭包问题解析与修复
为什么输出全是4?
Python的函数闭包采用延迟绑定机制:函数内部引用的变量,并不是在函数定义时就确定其值,而是在函数实际调用时才去当前作用域中查找变量的最新值。
在你的代码里,循环过程中定义的四个f函数都引用了同一个循环变量i。当循环结束时,i的值已经变成了4,所以后续调用这四个函数时,都会取到这个最终的i值,导致输出全是4。
如何修改代码输出1、2、3、4?
这里提供几种常用的修复方案:
方案1:利用函数默认参数绑定当前值
默认参数的求值时机是函数定义时,而非调用时,因此可以通过默认参数把循环当前的i值绑定到函数内部:
fs = [] for i in [1, 2, 3, 4]: def f(i=i): print(i) fs.append(f) for f in fs: f()
方案2:使用嵌套函数捕获当前值
创建一个嵌套的工厂函数,通过参数把循环当前的i值捕获并固定下来,返回的内部函数引用的是这个局部参数,而非循环变量:
fs = [] for i in [1, 2, 3, 4]: def make_func(num): def inner(): print(num) return inner fs.append(make_func(i)) for f in fs: f()
方案3:借助functools.partial绑定参数
使用functools.partial可以直接把当前的i值作为参数预先绑定到函数上:
from functools import partial fs = [] for i in [1, 2, 3, 4]: def print_num(num): print(num) fs.append(partial(print_num, i)) for f in fs: f()
内容的提问来源于stack exchange,提问作者Lucas Willems
相关产品推荐
相关产品推荐

