【问题标题】:Modifying a variable from parent scope when inside a local function [duplicate]在本地函数内部时从父范围修改变量[重复]
【发布时间】:2019-02-18 17:51:08
【问题描述】:

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

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

我在这里错过了什么?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 太棒了!我根本不知道这个关键字!这是 Python 3.x 上的新东西吗?从未在 2.x 代码上见过它。感谢您的快速回答!
    • 是的,它是在 v3 中添加的。
    • 据我了解,nonlocal 搜索封闭范围(最近的),直到找到命名变量(首先找到它)。它需要在某个时候定义变量,但不会使用全局变量。 (如果这个理解有误,请在此补充说明……)
    猜你喜欢
    • 2017-08-05
    • 2020-09-25
    • 2022-11-10
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多