为了账号安全,请及时绑定邮箱和手机立即绑定

闭包啊闭包

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

正在回答

1 回答

fs = []

for i in range(1, 4):

    def f(j):

        def g():

            return j*j

        return g

r = f(i)

print (type(r))

fs.append(r)

print (fs)


>>> 

1 4 9

<class 'function'>

[<function f.<locals>.g at 0x018BD1E0>]



f(i)相当于 g   而不是g()   

f(i)()等于g()

希望对你有用

1 回复 有任何疑惑可以回复我~
#1

天堂之魔术师 提问者

thanks
2015-07-08 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

闭包啊闭包

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信