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

Why can't an annotated variable be global?

运行

global global_values
global_values: str = []

给予

SyntaxError: annotated name 'global_values' can't be global

有什么原因吗?

这已在 PEP-526 中解释:

It is illegal to attempt to annotate variables subject to global or nonlocal in the same function scope:

def f():
    global x: int  # SyntaxError

def g():
    x: int  # Also a SyntaxError
    global x

The reason is that global and nonlocal don't own variables; therefore, the type annotations belong in the scope owning the variable.

对已接受答案的给出的解释实际上毫无意义,似乎已被接受在这里允许这样做:https://bugs.python.org/issue34939,但是到目前为止 - Python 3.8 - 它不是'尚未实施。

问题一定是实施问题,而不是逻辑问题。

因此,就像非常旧语言功能 经常出现的情况一样,这令人困惑。 global in python 是声明一个 name 的语句匹配 globals() 类似字典的容器中的键。 如果键 已经 globals() 类似字典的容器中,它将被添加。届时它将默认为 None 的值。 如果在全局范围内分配变量(并在当时定义),则变量的 name 被添加到 globals()类似字典的容器,并且 value 设置为匹配 name[= 的键的值44=]globals() 类似字典的容器中。

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

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

我仍然认为这是精神上的错误。这并不明显。不清楚。这不是很明智。然而,它就在那里。

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