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

时间:2019-02-18 17:51:09

标签: python python-3.x

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

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行为。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

您正在寻找nonlocal关键字。它允许您访问在周围范围(而不是全局范围)中定义的变量。

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

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

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