正如我对下面代码中的 global 语句的理解,它应该防止 function_two 重新绑定(bind)名称 test,而是修改 function_one 中的 test。但是,我收到 NameError: global name 'test' is not defined。

def function_one():
    test = 1
    def function_two():
        global test
        test += 1
    function_two()
    print test
function_one()

我已经看过了,但找不到这样的例子。我错过了什么?

最佳答案

Python 2 不支持非本地的概念。闭包(从父函数访问 test)仅支持读访问,不支持 Python 2 中的赋值。
global 关键字确实意味着全局,例如该名称位于模块(全局)命名空间中。 function_one() 函数的命名空间不是全局的,它是本地的(对该函数而言)。

在 Python 3 中,您可以将名称标记为 nonlocal ,这将使您的示例按预期工作。见 PEP 3104 - Access to Names in Outer Scopes

在 Python 2 中,您将不得不求助于技巧。例如,使名称成为嵌套函数的属性。允许将函数对象作为闭包“读取”,以及在此类封闭对象上设置属性:

def function_one():
    def function_two():
        function_two.test += 1

    function_two.test = 1
    function_two()

    print test

另一个技巧是使用可变对象,例如列表或字典。同样,您只是读取封闭名称,然后直接更改结果对象:
def function_one():
    test = [1]

    def function_two():
        test[0] += 1

    function_two()

    print test[0]

关于python - 在嵌套函数中使用全局名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34518268/

10-14 15:52
查看更多