闭包(closure) 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包
# 闭包常见坑 def count(): # 定义列表,列表里存放的是定义的函数 fs = [] for i in range(1,4): # 定义了一个函数f # f是一个闭包结构 def f(): return i*i fs.append(f) return fs f1,f2,f3 = count() print(f1()) print(f2()) print(f3())输出如下:
9 9 9出现的问题: 造成上述状况的原因是,返回函数引用了变量i, i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都返回的是 3*3 此问题描述成:返回闭包时,返回函数不能引用任何循环变量 解决方案: 再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变
# 修改上述函数 def count2(): def f(j): def g(): return j*j return g fs = [] for i in range(1,4): fs.append(f(i)) return fs f1,f2,f3 = count2() print(f1()) print(f2()) print(f3())输出结构:
1 4 9