代码之家  ›  专栏  ›  技术社区  ›  jxie0755

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

  •  3
  • jxie0755  · 技术社区  · 8 年前

    首先,我完全明白 global 陈述的方式和方法。

    现在,让我们看看这个:

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

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

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

    1 回复  |  直到 8 年前
        1
  •  10
  •   chepner    8 年前

    global x 不定义、声明或以其他方式创建 x 是的。它只是说如果和什么时候 在当前函数作用域中分配给(无论该分配是在 global 声明,因此强烈建议 全球的 语句在函数开始时使用),则赋值给该名称的全局变量,而不是局部变量。实际的创建仍然是实际任务的工作。

    换一种说法, 全球的 不会自行生成任何字节码;它只是修改其他赋值语句可能生成的字节码。考虑这两个功能:

    def f():
        global x
        x = 99
    
    def g():
        x = 99
    

    这两个函数的字节码的唯一区别是 f 使用 STORE_GOBAL 由于 全球的 声明,而 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
    

    如果你要添加一个“未使用的” 全球的 语句,例如

    def h():
        global xxx
        x = 99
    

    生成的字节码与 以下内容:

    >>> dis.dis(h)
      3           0 LOAD_CONST               1 (99)
                  2 STORE_FAST               0 (x)
                  4 LOAD_CONST               0 (None)
                  6 RETURN_VALUE