gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:29 25 4
gpt4 key购买 nike

据我理解下面代码中的全局语句,它应该防止 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 关键字确实意味着 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com