首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python3.8 3.8中使用带全局/非局部变量的封闭函数时的一个问题

在Python3.8 3.8中使用带全局/非局部变量的封闭函数时的一个问题
EN

Stack Overflow用户
提问于 2022-06-13 14:17:13
回答 1查看 41关注 0票数 0

我想知道封闭函数是如何工作的,我运行三个代码块,如下所示。

区块1

代码语言:javascript
复制
def a1_(r):
    r+=1
    res = 0
    print('a1_res=',id(res))
    def a2(r):
        global res
        print('res = ',res)
        print('a2_res=',id(res))
        res+=r
        return res
    return a2(r)

a1_(1)

它不能工作,错误是NameError:未定义名称'res‘,发生在第6行。

区块2

代码语言:javascript
复制
def foo():
    a = 1
    def foo2():
        global a
        print(a)
        a+=1
        return a
    return foo2()
foo()

这是没有任何错误的工作。

块3

我把第一座中的“全局”改为“非本地”,它有效!

代码语言:javascript
复制
def a1_(r):
    r+=1
    res = 0
    print('a1_res=',id(res))
    def a2(r):
        nonlocal res
        print('res = ',res)
        print('a2_res=',id(res))
        res+=r
        return res
    return a2(r)

a1_(1)

只是觉得很困惑,因为块1和块2的结构是相似的。然而,第2项有效,但第1项无效。

此外,在第3块中,我将“全局”替换为“非本地”,它起作用。(PS:在我看来,全局和非局部的效果是一样的)

有人能帮我弄清楚吗?非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2022-06-13 14:37:34

据我所知,第2块不应该也起作用,至少对我不起作用。可以使用print(globals())查看全局命名空间中的哪些变量。

对于块1和块2,您尝试访问全局命名空间中的一个变量,只有在该命名空间中定义该变量时,该变量才能工作。

对于块3,您正在使用非本地的方式访问外部命名空间中的变量。如果您在搜索工程中搜索python名称空间,您可能会更多地了解您正在调查的内容(例如)。

编辑:NameError: name 'res' is not defined告诉您,这个变量没有在相关的命名空间中定义。调用global res告诉Python,即使res不是以前在全局命名空间中定义的,但是在使用它之前需要定义它,因此导致错误的行应该是print('res = ', res),因为在这里res不是在全局命名空间中定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72604397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档