关于python闭包的循环,为什么结果全是9

RunAway
  • 1
新手上路,请多包涵
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f = count()
for ff in f:
    print(ff())

为什么这段程序运行结果全都是9,一直没理解

回复
阅读 424
2 个回答

fs 里所有成员引用的 i ,都是同一个 i 。

返回闭包时需要记住:函数中不要引用任何循环变量,或者后续会发生变化的变量(因为返回的函数此时类似于懒加载,尚未执行,而变量已经发生变化)

那如果需要这样做,可以用如下代码:

def count():
    fs = []
 
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        fs.append(f(i))
    return fs

f = count()
for ff in f:
    print(ff())

此时 f(i)已经将循环变量的当前值进行了绑定,所以可以正常显示结果

宣传栏