为什么带注释的变量不能是全局的?

Tha*_*ner 22 global-variables syntax-error python-3.x

跑步

def function():
    global global_values
    global_values: str = []
Run Code Online (Sandbox Code Playgroud)

给出

SyntaxError: annotated name 'global_values' can't be global
Run Code Online (Sandbox Code Playgroud)

这有什么原因吗?

blh*_*ing 17

PEP-526对此进行了解释:

尝试注释受相同函数作用域影响或处于同一函数作用域内的global变量 是非法的:nonlocal

def f():
    global x: int  # SyntaxError

def g():
    x: int  # Also a SyntaxError
    global x
Run Code Online (Sandbox Code Playgroud)

原因是globalandnonlocal不拥有变量;因此,类型注释属于拥有该变量的范围。

解决方案是在函数外部(即全局命名空间中)注释变量,并删除函数作用域内的类型注释。

  • 这意味着什么?那么如何输入注释全局? (4认同)

uch*_*aka 8

因此,正如非常古老的语言功能经常出现的情况一样,这很令人困惑。 globalpython 中的语句声明一个名称globals()与类似字典的容器中的键相匹配。如果该键尚未存在globals()类似字典的容器中,则会将其添加。此时它将默认为 None 值。如果在全局范围内分配变量(并在当时定义),则变量的名称将添加到globals()类似字典的容器中,并且将设置为与类似字典的容器中的名称匹配的键的值。globals()

因此,globalglobals()关键字是一个向类似字典的容器添加名称的语句。不幸的是,您无法在使用global将该变量的名称添加到globals()类似字典的容器的同一行中对变量进行赋值。

由于这种悲伤,向globals()类似字典的容器添加名称将隐式使其成为 Python 打字世界中的可选类型。

我仍然认为这是心理上的错误。这并不明显。不清楚。这确实不太明智。然而,它就在那里。

正确的做法是能够在全局化的同时立即将值分配给全局,从而具有非可选全局类型,并消除不明显、令人困惑的麻烦边缘情况是。打字很棒,如果能在 Python 中拥有更多打字功能就太好了。它有助于扩展,有助于消除导致困难错误的逻辑错误和歧义。当您没有考虑变量可能是与编写的代码完全不兼容的类型时,它会突出显示。