"全局"如何在if语句下表现?

INJ*_*E16 5 python global python-3.x

在我的程序中,我只想在某些情况下使用变量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))
Run Code Online (Sandbox Code Playgroud)

我期待结果是:

0
inside the function 1
outside the function 0
Run Code Online (Sandbox Code Playgroud)

然而事实证明是:

0
inside the function 1
outside the function 1
Run Code Online (Sandbox Code Playgroud)

所以,我在想,"好吧,也许Python编译器只要看到'global'关键字,无论它位于何处,都会使变量成为全局变量".这是Python如何与全局变量一起使用的吗?我误会了吗?

Jim*_*ard 5

是的,你正确地理解了事情.

global语句不是在运行时评估的内容.它实际上是解析器的一个指令,它实质上告诉它将所有列出的标识符(此处)视为引用全局范围.从对文档声明:aglobal

全局语句是一个声明,它适用于整个当前代码块.这意味着列出的标识符将被解释为全局变量.

然后它继续说明如何global真正的指令:

程序员注意:global是解析器的指令.

有条件地使用它没有任何区别:它的存在已经在解析阶段被检测到,因此,为获取名称而生成的字节码已经被设置为在全局范围内查找(with 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
Run Code Online (Sandbox Code Playgroud)

没有生成,global a因为它提供的信息已被使用!