上一篇介绍了闭包的概念,这一篇介绍下闭包的使用过程中需要注意的问题。
def count(): fs = [] for i in range(1,4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() print(f1()) print(f2()) print(f3())
执行结果:
9
9
9
上述代码中,每次循环返回函数f,其中保存了变量i,循环结束后返回了三个函数,此时i变成了3,此时再去执行三个函数时,都会返回3*3=9,所以闭包中的返回函数不要引用后续会发生变化的变量。
如果一定要引用循环中的变量,可以再定义一个函数,把结果保存在该函数返回值中,后续变量发生变化,该函数里的结果不会变化
def count(): fs = [] def f(j): def g(): return j*j return g for i in range(1,4): fs.append(f(i)) #此时执行了函数f(i),所以i的当前值被传入并把函数执行结果保存在函数g中。 return fs
f1, f2, f3 = count() print(f1()) print(f2()) print(f3())
执行结果:
1
4
9