首页 > 解决方案 > 如果在__main__中调用python闭包,闭包仍然可以访问函数中的变量。这怎么可能?

问题描述

在阅读 React hock 文档时,我发现函数在 JavaScript 中的工作方式与我在 C 中的预期不同。我也很好奇 Python 函数的工作方式与 JavaScript 类似,而且确实如此。下面是代码

def useState(initialValue):
    _val = initialValue
    def state():
        return _val
    def setState(newVal):
        nonlocal _val
        _val = newVal
    return state, setState

foo, setFoo = useState(0)
foo() # return 0; I expected that it should raise error because _val does not exist anymore after running useState function.
setFoo(1)
foo() # return 1

我虽然 Python 函数像 C 中的函数一样工作。我期望的是 Python 函数中的每个变量都在堆栈中,并且在执行函数之后,堆栈(变量)被删除。但是“setFoo”闭包仍然可以访问 useState 函数中的变量,并且调用 foo 返回状态。有人可以解释 Python 函数的工作原理或提供解释它如何工作的站点的参考吗?

标签: pythonfunctionstackclosures

解决方案


推荐阅读