我正在阅读有关名称空间和作用域的section 9.2.1,这时我遇到了以下代码段。
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)文档声称以下是输出:
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吗?
发布于 2019-02-12 17:43:24
不,默认情况下,它是函数作用域的局部,除非您显式声明。从Python Programming FAQ
在Python中,仅在函数内部引用的变量是隐式全局的。如果一个变量在函数体中的任何地方被赋值,除非显式声明为全局变量,否则它将被假定为局部变量。
请注意,您可以从任何作用域对全局变量的值进行访问,并且为此,您可以访问当前作用域的任何父作用域的值,但是除非您显式地表示将使用global关键字修改它,否则它的值不能更改。
发布于 2019-02-12 17:47:19
这里的文档是正确的-只需尝试代码以确保...
有一点您是对的:当do_global包含global spam时,它会更改全局变量spam的值。但是在位置3中打印的是scope_test函数中的spam变量,该变量没有被do_global更改。
第四个打印确实显示了在do_global中设置的全局spam的内容。
https://stackoverflow.com/questions/54646884
复制相似问题