python中的'global'可以引用未定义的变量吗?

时间:2018-02-12 08:33:43

标签: python python-3.x python-2.7 scope global

当我学习python的LEGB范围规则时,我想更深入地了解全局如何在python中工作。看来即使我引用了一个未定义的变量(也不是在内置中),代码也没有给我一个错误。请帮我弄清楚究竟发生了什么。

def hey():
    x = 1
    def hey2():
        global ew #ew not defined in the module
        x = 2
        print(x)
    hey2()
    print(x)
hey()

OUTPUT: 2
        1

3 个答案:

答案 0 :(得分:1)

关键字global用于在本地创建或更新全局变量

def hey():
    x = 1
    def hey2():
        global ew #reference to create or update a global variable named ew
        ew=2 # if you comment this global variable will not be created 
        x = 2
        #print(x)
    hey2()
    #print(x)
print '\t ------Before function call-----'
print globals()
hey()

print '\n'
print '\t -----After function call------ '
print globals()

globals()将为您提供全局范围包含的所有对象的字典

你可以在第二个字典中看到ew存在,这在第一个字典中没有出现

答案 1 :(得分:1)

是的,global statement可以应用于未绑定的名称(未定义的变量),甚至从未使用过。它不会创建名称,但会通知编译器只应在全局范围内查找此名称,而不是在本地范围内查找。差异在编译的代码中显示为不同的操作:

>>> def foo():
...   global g
...   l = 1
...   g = 2
...
>>> dis.dis(foo)
  3           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (l)

  4           6 LOAD_CONST               2 (2)
              9 STORE_GLOBAL             0 (g)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

我们看到STORE_FAST用于局部变量,而STORE_GLOBAL用于全局变量。 global语句本身没有任何输出;它只改变了对g的引用的操作方式。

答案 2 :(得分:-1)

两个函数中全局变量的简单示例     def hey():         全球x         x = 1         打印x     嘿()#打印1     def hey2():         全球x         x + = 2         打印x     hey2()#prints 3