为什么我可以在 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