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

这样的代码执行后fs=[f(1),f(2),f(3)]吗

这样的代码执行后fs=[f(1),f(2),f(3)]吗

stefan71 2016-11-26 11:29:03
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 回答

?
Iamxiaoq

TA贡献33条经验 获得超6个赞

闭包问题,首先,你得先明白在python里面,一切皆对象,函数也是一个对象。

在函数这个对象里面有一个特殊的属性,那就是__closure__,这是函数的一个闭包属性(姑且这么叫吧),用来存储其引用的外层函数的变量,该属性在定义的时候创建,而不是执行时。看图

//img1.sycdn.imooc.com//583d7aa20001972c04890263.jpg

然后再理解一下代码应该没多大问题了

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                # return __closure__[0].cell_contents * __closure__[0].cell_contents
                return j*j 
            return g
        # 执行f(i)返回创建函数g返回,此时g.__closure__[0].cell_contents存储的就是i的值
        # [g.__closure__[0].cell_contents=1, g.__closure__[0].cell_contents=2, g.__closure__[0].cell_contents=3]
        r = f(i) 
        fs.append(r)
    return fs

f1,f2,f3=count()
print f1(), f2(), f3()

水平有限,只能解释成这样了。

查看完整回答
反对 回复 2016-11-29
  • 1 回答
  • 0 关注
  • 1621 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信