python-3.x 为什么带注解的变量不能是全局变量?

wqnecbli  于 2023-03-31  发布在  Python
关注(0)|答案(3)|浏览(133)

跑步

def function():
    global global_values
    global_values: str = []

给予

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

这有什么原因吗?

rsl1atfo

rsl1atfo1#

PEP-526对此进行了解释:
在同一个函数作用域中尝试注解受globalnonlocal约束的变量是非法的:

def f():
    global x: int  # SyntaxError

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

原因是globalnonlocal不拥有变量;因此,类型注解属于拥有该变量的作用域。
解决方案是在函数外部(即在全局命名空间中)注解变量,并删除函数范围内的类型注解。

wfsdck30

wfsdck302#

所以,就像非常 * 旧的语言特性 * 的情况一样,这是令人困惑的。global在python中是一个声明名称匹配globals()字典式容器中的键的语句。如果键不在globals()字典式容器中,它将被添加。此时它的默认值为None。如果在全局范围内分配变量(当时的定义),然后将变量的***name***添加到globals()类似字典的容器中,并将***value***设置为与***匹配的键的值name***在globals()类似字典的容器中。
因此,***global***关键字是一个向globals()类似字典的容器添加名称的语句。不幸的是,您不能在使用***global***向globals()类似字典的容器添加变量名称的同一行中对变量进行赋值。
由于这种悲哀,向类似于字典的globals()容器添加一个名称将隐含地使其成为Python类型世界中的可选类型。
我仍然认为这是一个精神上的错误。它不明显。它不清楚。它不是真正明智的。但它就在那里。
正确的做法应该是能够立即为全局赋值,同时使其成为全局的,因此具有非Optional全局类型,并且还删除了不明显的,令人困惑的边缘情况。类型很棒,如果在Python中有更多的类型,那就太好了。它有助于扩展,它有助于消除导致困难bug的逻辑错误和歧义。2它突出显示了当你没有考虑到一个变量可能是一个与所写代码完全不兼容的类型时的情况。

rnmwe5a2

rnmwe5a23#

对公认答案的解释实际上是毫无意义的,而且在这次讨论中,annotating global variables似乎是一致的:https://bugs.python.org/issue34939,但是到目前为止- Python 3.8 -它还没有实现。
问题一定出在执行上,而不是逻辑上。

相关问题