Python基础10 闭包
闭包
内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。
def calc_sum(lst):
def lazy_sum():
return sum(lst)
return lazy_sum
函数作为返回值
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f = lazy_sum(1, 3, 5, 7, 9)
f()
- 局部变量
args
被返回函数引用- 返回的函数并没有立刻执行,而是直到调用了f()才执行
返回函数中包含循环变量
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
f1()//返回9
f2()//返回9
f3()//返回9
原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。返回函数
不要引用任何循环变量
,或者后续会发生变化的变量
解决方案
def count():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
fs.append(f(i))//调用了函数f(i)
return fs
f1, f2, f3 = count()
f1()//返回1
f2()//返回4
f3()//返回9