闭包的经典误区

def f1():
    a=10
    def f2():
        a = 20
        print(a)
    # print(a)
    return f2

f = f1()

print(f)
print(f.__closure__)
<function f1.<locals>.f2 at 0x7fefd0292700>
None

为什么为None,难道f2没return的原因?

def f1():
    a=10
    def f2():
        # a被python认为是局部变量,与外面的a没半点关系
        a = 20
        return a
    # print(a)
    return f2

f = f1()

print(f)
print(f.__closure__)

还是None

<function f1.<locals>.f2 at 0x7f99f02ba700>
None

什么情况呢?跟f2有没有return一点关系都没有,主要原因外部的a没被f2调用

def f1():
    a=10
    def f2():
        # a被python认为是局部变量
        s = a*3
    # print(a)
    return f2

f = f1()

print(f)
print(f.__closure__)
<function f1.<locals>.f2 at 0x7fc2f00aa700>
(<cell at 0x7fc2f006c310: int object at 0x10fd25bb0>,)
def f1():
    a=10
    def f2():
        return a
    # print(a)
    return f2

f = f1()

print(f)
print(f.__closure__)
<function f1.<locals>.f2 at 0x7fda18092700>
(<cell at 0x7fda0807c310: int object at 0x104e1bbb0>,)

总结: 内部函数必须饮用外部函数定义的环境变量,才能形成闭包

results matching ""

    No results matching ""