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

时间:2018-07-11 14:45:01

标签: python global

首先,我完全理解global语句的含义和用法。

现在,让我们来看一下:

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

print(f())
# >>> 99
print(x)
# >>> 99

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

但是xxx根本不存在,为什么我可以对其进行全局化,即使执行该功能,它也不会带来任何错误?

1 个答案:

答案 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