在本地函数内部时,从父范围修改变量



我正在尝试完成类似以下操作:

def counter():
    _n = 0
    def _increase():
        _n += 1
        return _n
    return _increase

上面的示例应该这样的行为:

>>> c = counter()
>>> c()
1
>>> c()
2
>>> c()
3

但是,在尝试复制此问题时,我会收到以下错误:

>>> c = counter()
>>> c()
UnboundLocalError: local variable '_n' referenced before assignment

看起来它正在尝试在本地范围中找到变量,因此我将代码更改为以下:

def counter():
    _n = 0
    def _increase():
        global _n
        _n += 1
        return _n
    return _increase

看来它现在可以找到它可以了,但是显然,即使我在声明该功能之前执行_n = 0

>>> c = counter()
>>> c()
NameError: name '_n' is not defined

显然我做错了什么,在这种情况下,我不知道特定的python行为。

我在这里缺少什么?

您正在寻找nonlocal关键字。它允许您访问在周围范围中定义的变量,但不能访问全局范围。

def counter():
    _n = 0
    def _increase():
        nonlocal _n
        _n += 1
        return _n
    return _increase

现在它应该按照您的意图工作。

>>> c = counter()
>>> c()
1
>>> c()
2
>>> c()
3

最新更新