关于python:在本地函数内部修改父作用域中的变量

Modifying a variable from parent scope when inside a local function

本问题已经有最佳答案,请猛点这里访问。

我正在尝试完成以下任务:

1
2
3
4
5
6
def counter():
    _n = 0
    def _increase():
        _n += 1
        return _n
    return _increase

上述示例的行为如下:

1
2
3
4
5
6
7
>>> c = counter()
>>> c()
1
>>> c()
2
>>> c()
3

但是,当尝试复制此内容时,我得到以下错误:

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

UnboundLocalError: local variable '_n' referenced before assignment

看起来它试图在本地范围内查找变量,因此我将代码更改为以下内容:

1
2
3
4
5
6
7
def counter():
    _n = 0
    def _increase():
        global _n
        _n += 1
        return _n
    return _increase

看起来它现在可以很好地定位它,但显然它没有初始化,即使我在声明函数之前执行_n = 0

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

NameError: name '_n' is not defined

显然,我做了一些错误的事情,在本例中,我不知道具体的Python行为。

我这里缺什么?


您正在查找nonlocal关键字。它允许您访问在周围作用域中定义的变量,但不允许访问全局作用域。

1
2
3
4
5
6
7
def counter():
    _n = 0
    def _increase():
        nonlocal _n
        _n += 1
        return _n
    return _increase

现在它应该可以按您的预期工作了。

1
2
3
4
5
6
7
>>> c = counter()
>>> c()
1
>>> c()
2
>>> c()
3