Python 在嵌套函数中使用全局名称

Python 在嵌套函数中使用全局名称,python,python-2.7,scope,nested,global,Python,Python 2.7,Scope,Nested,Global,正如我理解下面代码中的全局语句一样,它应该防止函数_2重新绑定名称测试,而是修改函数_1中的测试。但是,我得到了NameError:未定义全局名称“test” def function_one(): test = 1 def function_two(): global test test += 1 function_two() print test function_one() 我已经看过了,但找不到这样的例子。我缺少什么?Py

正如我理解下面代码中的全局语句一样,它应该防止函数_2重新绑定名称测试,而是修改函数_1中的测试。但是,我得到了NameError:未定义全局名称“test”

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\u one()
函数的命名空间不是全局的,而是局部的(对于该函数)

在Python3中,可以将名称标记为,这将使示例按预期工作。看

在Python2中,您将不得不求助于技巧。例如,将名称作为嵌套函数的属性允许将函数对象作为闭包读取,也允许在此类闭合对象上设置属性:

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 3)的含义不同<代码>全局实际上是指全局,例如不在函数中<代码>测试在
函数中_two
期望有一个全局名称
测试
;忽略
function_one()
中的本地名称
test
。您使用的是Python 2还是Python 3?大概是Python2,因为您使用
print
作为语句。@name\u no:no,那不行。您将得到一个
UnboundLocalError:assignment之前引用的局部变量“test”异常。相关:是的,它是没有目的的代码。我只想要一个简单的例子来说明我对全局声明的困惑。答案很有启发性。