闭包返回函数不引用循环变量

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

f1, f2, f3 = count()
"""
print f1()  ---> 9
print f2()  ---> 9
print f3()  ---> 9
"""
# 全部都是9! 原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9
# 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
# 如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
def count():
    def f(j):
        return j*j
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs
f4,f5,f6 = count()
"""
print f4  ---> 1
print f5  ---> 4
print f6  ---> 9
"""

猜你喜欢

转载自blog.csdn.net/weixin_42364322/article/details/85054496