为什么我可以在 python 中全局化一个不存在的变量
Why am I able to global a non-existing variable in python
首先,我完全理解global
语句的含义和使用方法。
现在,让我们看看这个:
x = 100
def f():
global x
global xxx
x = 99
return x
print(f())
# >>> 99
print(x)
# >>> 99
可以看到,通过使用global x
,我成功修改了全局环境中x的值
但是xxx
根本不存在,为什么我可以让它全局化,而且即使执行函数也不会报错?
global x
不定义、声明或以其他方式创建 x
。它只是说明如果 x
在当前函数范围内被赋值(赋值是在 global
语句之前还是之后,这就是为什么强烈建议 global
语句在函数的开头使用),赋值给同名的全局变量,而不是局部变量。实际创建仍然是实际分配的工作。
换句话说,global
本身不生成任何字节码;它只是修改其他赋值语句可能生成的字节码。考虑这两个函数:
def f():
global x
x = 99
def g():
x = 99
这两个函数在字节码上的唯一区别是 f
使用 STORE_GOBAL
作为 global
语句的结果,而 g
使用 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
如果您要添加 "unused" global
语句,例如
def h():
global xxx
x = 99
生成的字节码与 g
:
没有区别
>>> dis.dis(h)
3 0 LOAD_CONST 1 (99)
2 STORE_FAST 0 (x)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
首先,我完全理解global
语句的含义和使用方法。
现在,让我们看看这个:
x = 100
def f():
global x
global xxx
x = 99
return x
print(f())
# >>> 99
print(x)
# >>> 99
可以看到,通过使用global x
,我成功修改了全局环境中x的值
但是xxx
根本不存在,为什么我可以让它全局化,而且即使执行函数也不会报错?
global x
不定义、声明或以其他方式创建 x
。它只是说明如果 x
在当前函数范围内被赋值(赋值是在 global
语句之前还是之后,这就是为什么强烈建议 global
语句在函数的开头使用),赋值给同名的全局变量,而不是局部变量。实际创建仍然是实际分配的工作。
换句话说,global
本身不生成任何字节码;它只是修改其他赋值语句可能生成的字节码。考虑这两个函数:
def f():
global x
x = 99
def g():
x = 99
这两个函数在字节码上的唯一区别是 f
使用 STORE_GOBAL
作为 global
语句的结果,而 g
使用 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
如果您要添加 "unused" global
语句,例如
def h():
global xxx
x = 99
生成的字节码与 g
:
>>> dis.dis(h)
3 0 LOAD_CONST 1 (99)
2 STORE_FAST 0 (x)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE