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

没看明白,求详解?

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()

--------f1创建时,调用count()函数,先成成一个空列表fs,接下来进行循环,因内部函数未被调用不执行,跳至r=f(1),调用f(j)函数,因g()未被调用不执行,跳至ruturn g 返回g函数,但因g函数未被调用,不返回值,继续第2轮循环r=f(2),第3轮循环r=f(3),fs=[f(1),f(2),f(3)]

----f1()调度函数时 fs就变成了[1,4,9]

----但为什么正确的结果却为f1()=1,不明白??

正在回答

2 回答

def count():
    fs = []
    for i in range(1, 4):
        print('查看i的值:',i)  #查看i的值
        def f(j):
            def g():
                return j * j
            return g
        r = f(i)
        print('查看r的值:', r)   #查看r的值
        fs.append(r)
    return fs
print ('创建f1,f2,f3')  #提示创建f1,f2,f3
f1, f2, f3 = count()
print ('输出f1,f2,f3')  #提示输出f1,f2,f3
print(f1(),f2(),f3())
这是我给上一个同学的解释,复制过来你看看。

你看看我详细给你的解释,也许你就懂了。请看这段我注释和几个添加了print的代码。f1, f2, f3 = count()中为何要有3个元素f1, f2, f3?因为count()返回的是fs,而fs是什么?是列表。什么列表?有3个元素的列表。为什么有3个元素?因为for语句的rang(1,4)。所以相当于

f1,f2,f3=[ 值,值 ,值 ]。所以f1, f2, f3中你不能多写一个f4或少写f1, f2, f3其中任何一个,因为你要分别匹配[ 值,值 ,值 ]3个。好,现在我问你列表里的值是什么?是[1,4,9]?哈哈,错了,不是,你可以看到r输出的是<function count.<locals>.f.<locals>.g at 0x10067bae8>  之类的(有3个)。我们来分析r = f(i)。首先第一个循环,i=1,那就是f(1),请问f(1)返回的给r的是什么?看到return g没有?是g,也就是g()函数的地址,f1-->r-->g,f1指向的是g的地址。剩下的i=2、i=3一样。所以r就是g()函数的地址。fs.append(r)就是将r追加到列表fs[]中,所以输出r你看到的是以下输出:

[<function count.<locals>.f.<locals>.g at 0x10067bae8>, <function count.<locals>.f.<locals>.g at 0x10067ba60>, <function count.<locals>.f.<locals>.g at 0x10067bb70>]

看到了吗?[地址,地址,地址]。ps:g的地址为什么不同?因为你创建循环3次调用了f(),自然调用了3次g()

终于最后一步了:print(f1(),f2(),f3()),你会问为什么f1还要加上()。f1指向的是g的地址,所以f1()表示什么?表示是g()。i=1,传参数给j。所以g()就返回1*1(return j * j)。同理f2()=2*2,f3()=3*3.

望采纳,共勉~

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

请看2-8节如下内容:

http://img1.sycdn.imooc.com//58706d630001341a03580405.jpg

在调用f()时,会执行内部定义的lazy_sum()函数,完成return sum(lst)求和过程,得到10

同样的,你分析过程都很详细

http://img1.sycdn.imooc.com//58706e0f0001f2d108570091.jpg

我划出来的,应该是这样解释的,当调到r=f(1)时,执行g函数,完成return j*j的过程,所以最后得到了[1,4,9]


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

举报

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

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

进入课程

没看明白,求详解?

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