Python 在嵌套函数中使用全局名称
正如我理解下面代码中的全局语句一样,它应该防止函数_2重新绑定名称测试,而是修改函数_1中的测试。但是,我得到了NameError:未定义全局名称“test”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
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”异常。相关:是的,它是没有目的的代码。我只想要一个简单的例子来说明我对全局声明的困惑。答案很有启发性。