首先,我完全理解global
语句的含义和用法。
现在,让我们来看一下:
x = 100
def f():
global x
global xxx
x = 99
return x
print(f())
# >>> 99
print(x)
# >>> 99
您可以看到,通过使用global x
,我成功地在全局环境中更改了x的值。
但是xxx
根本不存在,为什么我可以对其进行全局化,即使执行该功能,它也不会带来任何错误?
答案 0 :(得分:10)
global x
没有定义,声明或创建x
。它仅说明在当前函数作用域中是否以及何时将x
分配给该对象(无论该赋值是在global
语句之前还是之后),因此强烈建议使用global
语句(在函数的开头使用),则分配给具有该名称的全局变量,而不是局部变量。实际的创建仍然是实际任务的工作。
换句话说,global
本身不会生成任何字节码;它只是修改其他赋值语句可能生成的字节码。考虑以下两个功能:
def f():
global x
x = 99
def g():
x = 99
这两个函数的字节码唯一不同是f
语句的结果是STORE_GOBAL
使用global
,而g
使用{{1} }。
STORE_FAST
如果要添加“未使用的” >>> dis.dis(f)
5 0 LOAD_CONST 1 (99)
3 STORE_GLOBAL 0 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
>>> dis.dis(g)
8 0 LOAD_CONST 1 (99)
3 STORE_FAST 0 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
语句,例如in
global
生成的字节码与def h():
global xxx
x = 99
不可区分:
g