猿问

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

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


stefan71
浏览 1622回答 1
1回答

Iamxiaoq

闭包问题,首先,你得先明白在python里面,一切皆对象,函数也是一个对象。在函数这个对象里面有一个特殊的属性,那就是__closure__,这是函数的一个闭包属性(姑且这么叫吧),用来存储其引用的外层函数的变量,该属性在定义的时候创建,而不是执行时。看图然后再理解一下代码应该没多大问题了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()水平有限,只能解释成这样了。
随时随地看视频慕课网APP

相关分类

Python
我要回答