免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2747 | 回复: 6
打印 上一主题 下一主题

请教大神一个关于python闭包的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-13 18:21 |只看该作者 |倒序浏览
本帖最后由 凤城骄子 于 2015-09-13 18:25 编辑

有个关于python闭包的例子:
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()

疑问:
1.函数count()返回的不是一个列表吗?
2.帮忙解释下倒数第二行是什么意思?
3.为什么print count()的结果是一个空的列表[, , ]?
4.劳烦大神解释下这个例子的执行流程是什么样的。

谢谢了!

论坛徽章:
0
2 [报告]
发表于 2015-09-13 23:50 |只看该作者
1,是列表,2,调用函数,3,不是空的,列表的值是三个j*j 函数

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
3 [报告]
发表于 2015-09-14 21:26 |只看该作者
  1. >>> def count():
  2. ...     fs=[]
  3. ...     for i in range(1, 4):
  4. ...             def f(j):
  5. ...                     def g():
  6. ...                             return j*j
  7. ...                     return g
  8. ...             r=f(i)
  9. ...             fs.append(r)
  10. ...     return fs
  11. ...
  12. >>> f1,f2,f3=count()
  13. >>> print f1(),f2(),f3()
  14. 1 4 9
复制代码

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [报告]
发表于 2015-09-14 21:26 |只看该作者
print count()
[<function g at 0x266a410>, <function g at 0x266a488>, <function g at 0x266a500>]

论坛徽章:
0
5 [报告]
发表于 2015-09-16 11:07 |只看该作者
回复 2# ma__


    还是没怎么明白这其中的逻辑。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
6 [报告]
发表于 2015-09-16 13:43 |只看该作者
回复 5# 凤城骄子
你可以这样子理解:
1. Count函数内部通过执行 f(j) 定义了三个函数,分别是:g() = 1*1, g() = 2*2, g() = 3*3
2. Count把三个函数的地址保存在列表里面返回。
3. f1, f2, f3按顺序用返回的列表中的函数地址赋值
4. 最后,f1()就是在执行g() = 1 * 1, f2()就是在执行g()=2*2, f3()就是在执行g()=3*3

论坛徽章:
0
7 [报告]
发表于 2015-09-17 18:17 |只看该作者
回复 6# icymirror


    明白了,终于明白了。其实主要是我对倒数第二行的那个赋值方式一头雾水,听你这么解释算是懂了。感谢大神!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP