当我学习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
答案 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