haf*_*n96 5 python closures scope namespaces
我试图了解闭包在Python中是如何工作的,并且发现了以下代码片段:
def closure():
count = 0
def inner():
nonlocal count
count += 1
print(count)
return inner
start = closure()
start() # prints 1
start() # prints 2
start() # prints 3
Run Code Online (Sandbox Code Playgroud)
我可以理解这段代码,因为inner定义函数时,封闭范围内有一个名为count的变量,其值为0,然后内部函数将使用remember该值
但是,如果我随后移至count = 0内部函数下方,则代码将变为:
def closure():
def inner():
nonlocal count
count += 1
print(count)
count = 0
return inner
start = closure()
start() # prints 1
start() # prints 2
start() # prints 3
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,该代码仍然可以正常工作,这确实使我感到困惑。正如何时inner定义的那样,变量count在封闭范围中不存在,inner函数如何才能记住此时名称空间中尚不存在的值?
是因为Python中还存在类似于JS的变量提升的东西吗?
在这两个示例中,您都在start变量中接收闭包方法返回的值,即方法闭包被执行并返回内部本地方法。因此count变量也被定义并初始化为值 0
当您使用start()调用内部方法时,该方法将被执行,到那时,在这两种情况下, count 变量都已经存在
但是如果你有类似这样的代码,那么就会出现引用错误
def closure():
def inner():
nonlocal count
count += 1
print(count)
inner()
count = 0
start = closure()
Run Code Online (Sandbox Code Playgroud)
这里在定义count之前调用内部方法