正如我对下面代码中的 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/