闭包的经典误区
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>,)
总结: 内部函数必须饮用外部函数定义的环境变量,才能形成闭包