'全球'在if语句下表现?

时间:2017-05-08 03:33:37

标签: python python-3.x global

在我的程序中,我只想在某些情况下使用变量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如何与全局变量一起使用的吗?我误解了吗?

1 个答案:

答案 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没有生成任何内容,因为它提供的信息已被使用!