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不拥有变量;因此,类型注释属于拥有该变量的范围。
解决方案是在函数外部(即全局命名空间中)注释变量,并删除函数作用域内的类型注释。
因此,正如非常古老的语言功能经常出现的情况一样,这很令人困惑。
globalpython 中的语句声明一个名称globals()与类似字典的容器中的键相匹配。如果该键尚未存在于globals()类似字典的容器中,则会将其添加。此时它将默认为 None 值。如果在全局范围内分配变量(并在当时定义),则变量的名称将添加到globals()类似字典的容器中,并且值将设置为与类似字典的容器中的名称匹配的键的值。globals()
因此,globalglobals()关键字是一个向类似字典的容器添加名称的语句。不幸的是,您无法在使用global将该变量的名称添加到globals()类似字典的容器的同一行中对变量进行赋值。
由于这种悲伤,向globals()类似字典的容器添加名称将隐式使其成为 Python 打字世界中的可选类型。
我仍然认为这是心理上的错误。这并不明显。不清楚。这确实不太明智。然而,它就在那里。
正确的做法是能够在全局化的同时立即将值分配给全局,从而具有非可选全局类型,并消除不明显、令人困惑的麻烦边缘情况是。打字很棒,如果能在 Python 中拥有更多打字功能就太好了。它有助于扩展,有助于消除导致困难错误的逻辑错误和歧义。当您没有考虑变量可能是与编写的代码完全不兼容的类型时,它会突出显示。