闭包(closure)
- 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,党内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包
- 上面定义的myF4是一个标准的闭包结构
def count():
fs = []
for i in range(1,4):
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