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

为什么多一层函数就能输出1,4,9

http://img1.sycdn.imooc.com//5e575bb30001a66c04470346.jpg

这样调用f(i)时  i不也是=3吗

正在回答

4 回答

个人理解:闭包是在外层函数结束时形成的,会在此时记录闭包中的变量,参数等。f和g相当于一个闭包,所以会在return g时形成闭包保存不同的三个i值。如果没有多一层函数的话,闭包是在return fs的时候形成的,三个返回函数使用的i值都是3。

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

有可能是因为套两层的时候 其实是在for循环之后在执行f函数,而三层则是在for循环中就执行了f函数,前者因为for循环结束i最后的结果是i=3所以结果是3*3,而在for循环中执行了f函数,则会根据每次执行时的i值变化结果

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

def count():

    fs = []

    for i in range(1, 4):

        def f(x):

            def g():

                return x * x

            return g

        fs.append(f(i))

    return fs


f1, f2, f3 = count()

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


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

调用 `f` 时,`i` 是外部传入的变量,第4行的 `i` 和第8行的 `i` 不是一层意思

相当于如下代码,就好解释了:

def count():    fs = []    for i in range(1, 4):        def f(x):            def g():                return x * x            return g        fs.append(f(i))    return fsf1, f2, f3 = count()print f1(), f2(), f3()


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

慕妹0070723 提问者

那直接def f(i): return i*i为什么就不行呢
2020-03-03 回复 有任何疑惑可以回复我~
#2

慕前端7352391 回复 慕妹0070723 提问者

因为return回去的i*i是一个值,不是函数名
2020-04-21 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

为什么多一层函数就能输出1,4,9

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