在局部函数中修改父作用域中的变量

2024-06-17 05:09:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力实现以下目标:

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

我错过了什么


Tags: 示例目标returnlocaldef错误counter情况
1条回答
网友
1楼 · 发布于 2024-06-17 05:09:20

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

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

现在,它应该按照您的预期工作

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

相关问题 更多 >