关于python闭包结构的问题

count1和count3得出的结果不一样,请问为什么?

def count1():

def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))

return fs

结果:1 4 9

def count3():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
fs.append(f(i))
return fs

结果:9 9 9

原谅我小白。。。

 # 希望一次返回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()  

print f1(), f2(), f3()  

当count()函数返回三个函数时,**这三个变量所引用的变量i的值已经变成了3**,因为在返回的时候三个函数并没有被调用,所以此时它们并没有及时计算它们对应的i乘以i的值,等到三个函数都返回时,然后调用三个函数,此时i的值已经为3,计算i乘以i的值自然就都是9了.

所以在返回闭包的情况下,我们一定要注意的一点就是:

返回函数千万不要引用任何一个循环变量,或者在之后会发生改变的变量.
当然对于这种情况我们还是有解决方法的.我们在内层函数f()内再定义一个内层函数g(),用这个函数的参数绑定循环变量的当前值,这样的话,无论循环变量之后如何改变,每一次循环中的循环变量i的值就都保存在了第三层函数g()中,如此得到了我们期望的输出结果.(也就是你的第一种方法)

正确的做法:
#coding:utf-8

author = 'chad'

# 希望一次返回3个函数,分别计算1x1,2x2,3x3:

def count():

fs = []

for i in range(1, 4):

def f(j):

def g():

return j*j

return g

fs.append(f(i))

return fs

f1, f2, f3 = count()  

print f1(), f2(), f3()  

希望一次返回3个函数,分别计算1x1,2x2,3x3:

def count():

fs = []

for i in range(1, 4):

def f(j):

def g():

return j*j

return g

fs.append(f(i))

return fs

f1, f2, f3 = count()

print f1(), f2(), f3()