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

python闭包函数这节不理解


def count():

    fs = []

    for i in range(1, 4):

        def f(j):

            def g():

                return j * j

            return g

        

        fs.append(f(i))#这里i是循环变量,fs内部添加进去的其实是f函数的每个值 ,那下面输出不应该直接是3个数组吗?而为什么每次输入一个f1 出来只是一个数,不应该是三个吗?

    return fs


f1, f2, f3 = count()

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


正在回答

3 回答

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

以上两段代码等价的,下面的好理解点,作用都是将变量 i 储存下来,确保了在函数 返回后不变。

count() 返回的是列表 fs ,此时 fs 中包含了3三个函数 f。也就是说,f1(),f2(),f3()调用的是对应的f(1),f(2),f(3)。

#个人理解,不对的欢迎指出

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

qq_Zzq_0 提问者

非常感谢!
2017-09-21 回复 有任何疑惑可以回复我~
#2

silly_LcK

是不是f1()直接调用j得出结果,不会调用i ?(就是说最后调用过程中不会经过for循环)。想了很久不知道是不是这个逻辑
2017-11-27 回复 有任何疑惑可以回复我~

f1(),f2(),f3()调用的是对应的f(1),f(2),f(3)。这句就没有理解,那f4(),f5(),f6()难道调用的是对应的f(4),f(5),f(6)么?

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

老夫上去就是点点点

我明白了,之前学for迭代的时候说过,如果前面的变量个数跟列表里的元素个数一样的话,那么会一一对应
2017-10-17 回复 有任何疑惑可以回复我~

fs.append(f(i))从循环下来,第一次相当于加进f(0)函数,并不是每个值,这时还没有实际执行,依次加入f(1)、f(2),当下面调用count时,将三个函数赋值给f1,f2,f3,print 后为实际调用

0 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

python闭包函数这节不理解

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