闭包啊闭包
# 希望一次返回3个函数,分别计算1x1,2x2,3x3: def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
在上面这个例子中,变量i相对函数f()来说是外部变量,当for i in range(1,4)运行的时候,f()中的i还没有定义,当python编译器想执行f()的时候,发现了变量i,python想i是什么?在f()中没有定义,于是去f()的外部找i.此时for循环的i已经执行完,结果是i=3。所以python给f()解释i=3.结果就是9,9,9.。
def count(): fs = [] for i in range(1, 4): def f(j): return j*j r = f(i) fs.append(r) return fs print count()
好,那就再f()中重新定义一个局部变量,不过这次算出来的是一个列表【1,4,9】,是因为r此时是f()函数的返回值
def count(): fs = [] for i in range(1, 4): def f(j): def g(): return j*j return g r = f(i) fs.append(r) return fs f1, f2, f3 = count() print f1(), f2(), f3()
到这里,我就不太明白了,我觉得是不是因为f(i)现在不是指函数f()的值,而是一个类似封装的东西,或者是一个指向,指向g()的值?