当函数存在嵌套,并且子函数引用了父函数中的变量,可以访问这些变量的作用域就形成了闭包,但是如果子函数没有访问父函数中的变量,就不存在闭包.
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()#f1(), f2(), f3()都是9
原式子中, i 并没有在f函数里面定义,而是去找的父函数的i变量,所以f和外部i构成闭包,i在range最后的取值为3,所以return fs的时候,闭包里面i的值基本确定了,每次调用的结果都是9.
def func(): fs = [] for i in range(1, 4): def inner(j = i):#把中间值保存下来,所以返回的是,1 4,9 return j*j fs.append(inner) return fs f1, f2, f3 = func() print(f1(), f2(), f3())
def func(): fs = [] for i in range(1, 4): def inner(x):#返回匿名函数 return lambda x: x*x fs.append(inner(i)) return fs f1, f2, f3 = func() print(f1(), f2(), f3())