在我的程序中,我只想在某些情况下使用变量global。说它看起来像这样:
a = 0
def aa(p):
if p:
global a
a = 1
print("inside the function " + str(a))
print(a)
aa(False)
print("outside the function " + str(a))
我期待结果是:
0
inside the function 1
outside the function 0
然而事实证明是:
0
inside the function 1
outside the function 1
所以,我在想,"好吧,也许Python编译器只要看到“全局”变量就会使变量成为全局变量。关键字,无论它位于何处"。这是Python如何与全局变量一起使用的吗?我误解了吗?
答案 0 :(得分:5)
是的,您正确理解了事情。
global
语句不是在运行时评估的内容。它实际上是解析器的指令,它基本上告诉它将所有列出的标识符(此处为a
)视为引用全局范围。来自the global
statement上的文档:
全局语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。
然后继续说明global
实际上是一个指令:
程序员注意:
global
是解析器的指令。
有条件地使用它 没有任何区别:它的存在已经在解析阶段被检测到,结果,为获取名称而生成的字节码已经被设置为查看全局范围(使用LOAD/STORE GLOBAL
)。
这就是为什么,如果dis.dis
包含global
语句的函数,您将无法看到global
的任何相关字节代码。使用愚蠢的功能:
from dis import dis
def foo():
"I'm silly"
global a
dis(foo)
2 0 LOAD_CONST 0 (None)
2 RETURN_VALUE
global a
没有生成任何内容,因为它提供的信息已被使用!