为什么我能在python中全局化一个不存在的变量

Cod*_*755 3 python global

首先,我完全理解global陈述的含义和使用方法.

现在,让我们来看看:

x = 100
def f():
    global x
    global xxx
    x = 99
    return x

print(f())
# >>> 99
print(x)
# >>> 99
Run Code Online (Sandbox Code Playgroud)

您可以看到,通过使用global x,我成功地在全局环境中更改了x的值.

但是xxx根本不存在,为什么我被允许全局化它甚至不会带来任何错误,即使该函数被执行?

che*_*ner 10

global x没有定义,声明或以其他方式创建x.它只是声明if和when x在当前函数作用域中被赋值(无论该赋值是在global语句之前还是之后,这就是强烈建议global在函数开头使用语句的原因),赋值是该名称的全局变量,而不是局部变量.实际创建仍然是实际任务的工作.

换句话说,global不会自己生成任何字节码; 它只是修改了其他赋值语句可能生成的字节码.考虑这两个功能:

def f():
    global x
    x = 99

def g():
    x = 99
Run Code Online (Sandbox Code Playgroud)

这两个函数的字节代码的唯一区别是在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
Run Code Online (Sandbox Code Playgroud)

如果要添加"未使用" global语句,例如in

def h():
    global xxx
    x = 99
Run Code Online (Sandbox Code Playgroud)

生成的字节代码与以下内容无法区分g:

>>> dis.dis(h)
  3           0 LOAD_CONST               1 (99)
              2 STORE_FAST               0 (x)
              4 LOAD_CONST               0 (None)
              6 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)