在嵌套函数中使用全局名称
Using global name in a nested function
据我理解下面代码中的全局语句,它应该防止function_two重新绑定名称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()
我看过了,找不到这样的例子。我错过了什么?
Python2不支持non-local的概念。闭包(从父函数访问 test
)仅支持 读取访问 ,不支持 Python 中的赋值 2.
global
关键字确实意味着 global,例如该名称位于模块(全局)命名空间中。 function_one()
函数的命名空间不是全局的,它是局部的(对于那个函数)。
在Python3中,你可以将名字标记为nonlocal
, which would make your example work as expected. See PEP 3104 - Access to Names in Outer Scopes。
在 Python 2 中,您将不得不诉诸技巧。例如,将名称设为嵌套函数的属性。 'reading' 允许函数对象作为闭包,在此类 closed-over 对象上设置属性也是如此:
def function_one():
def function_two():
function_two.test += 1
function_two.test = 1
function_two()
print test
另一个技巧是使用可变 对象,例如列表或字典。同样,您只是 读取 closed-over 名称,然后直接更改结果对象:
def function_one():
test = [1]
def function_two():
test[0] += 1
function_two()
print test[0]
据我理解下面代码中的全局语句,它应该防止function_two重新绑定名称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()
我看过了,找不到这样的例子。我错过了什么?
Python2不支持non-local的概念。闭包(从父函数访问 test
)仅支持 读取访问 ,不支持 Python 中的赋值 2.
global
关键字确实意味着 global,例如该名称位于模块(全局)命名空间中。 function_one()
函数的命名空间不是全局的,它是局部的(对于那个函数)。
在Python3中,你可以将名字标记为nonlocal
, which would make your example work as expected. See PEP 3104 - Access to Names in Outer Scopes。
在 Python 2 中,您将不得不诉诸技巧。例如,将名称设为嵌套函数的属性。 'reading' 允许函数对象作为闭包,在此类 closed-over 对象上设置属性也是如此:
def function_one():
def function_two():
function_two.test += 1
function_two.test = 1
function_two()
print test
另一个技巧是使用可变 对象,例如列表或字典。同样,您只是 读取 closed-over 名称,然后直接更改结果对象:
def function_one():
test = [1]
def function_two():
test[0] += 1
function_two()
print test[0]