You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:11:02