闭包(closure) 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,党内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包上面定义的myF4是一个标准的闭包结构 # 闭包常见坑 def count(): # 定义列表,列表里存放的是定义的函数 fs = [] for i in range(1,4): # 定义了一个函数f # f是一个闭包结构 print("for{0}".format(i)) def f(): print(i) return i*i fs.append(f) return fs f1,f2,f3 = count() print(f1()) print(f2()) print(f3()) for1 for2 for3 3 9 3 9 3 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