首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python教程中do_global()的效果

Python教程中do_global()的效果
EN

Stack Overflow用户
提问于 2019-02-12 17:36:03
回答 2查看 58关注 0票数 2

我正在阅读有关名称空间和作用域的section 9.2.1,这时我遇到了以下代码段。

代码语言:javascript
复制
def scope_test():
    def do_local():
        spam = "local spam"
    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"
    def do_global():
        global spam
        spam = "global spam"
    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

文档声称以下是输出:

代码语言:javascript
复制
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

我的问题是:由于在do_global()函数中使用了global关键字,第3行的输出不应该是global spam吗?

EN

回答 2

Stack Overflow用户

发布于 2019-02-12 17:43:24

不,默认情况下,它是函数作用域的局部,除非您显式声明。从Python Programming FAQ

在Python中,仅在函数内部引用的变量是隐式全局的。如果一个变量在函数体中的任何地方被赋值,除非显式声明为全局变量,否则它将被假定为局部变量。

请注意,您可以从任何作用域对全局变量的值进行访问,并且为此,您可以访问当前作用域的任何父作用域的值,但是除非您显式地表示将使用global关键字修改它,否则它的值不能更改。

票数 2
EN

Stack Overflow用户

发布于 2019-02-12 17:47:19

这里的文档是正确的-只需尝试代码以确保...

有一点您是对的:当do_global包含global spam时,它会更改全局变量spam的值。但是在位置3中打印的是scope_test函数中的spam变量,该变量没有被do_global更改。

第四个打印确实显示了在do_global中设置的全局spam的内容。

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

https://stackoverflow.com/questions/54646884

复制
相关文章

相似问题

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