gpt4 book ai didi

python - Python 的闭包是如何工作的

转载 作者:太空狗 更新时间:2023-10-30 01:10:46 25 4
gpt4 key购买 nike

我试图了解闭包在 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

我能理解这段代码,因为定义inner 函数时,封闭作用域有一个名为 count 的变量,值为 0,并且内部函数将记住 这个值然后

但是,如果我随后将 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

令我惊讶的是,代码仍然运行良好,这让我很困惑。当定义inner时,变量count不存在于封闭范围内,inner函数怎么能记住一个值此时命名空间中还不存在吗?

是不是因为类似于JS的变量hoisting的东西也存在于 Python 中?

最佳答案

在这两个示例中,您都在 start 变量中接收到 closure 方法返回的值,即方法 closure 被执行并且返回内部 本地方法。所以 count 变量也被定义并初始化为值 0

当您使用start() 调用inner 方法时,该方法将被执行,到那时,在这两种情况下,count 变量已经存在

但是如果你有类似这样的代码,那么就会出现引用错误

def closure():
def inner():
nonlocal count
count += 1
print(count)
inner()
count = 0

start = closure()

这里inner方法在定义count之前被调用

关于python - Python 的闭包是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57781820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com