我正在尝试复制我遇到的一个bug,它显示了以下情况:
NameError:未定义全局名称“sdrent”
但是,如果打开解释器并输入sdrent,则会得到以下错误:
>>> sdrent
NameError: name 'sdrent' is not definedNameError: global name...和NameError: name...有什么区别,我将如何复制前者?
发布于 2021-02-07 06:19:43
CPython有两个用于全局变量查找的操作码,LOAD_GLOBAL和LOAD_NAME。LOAD_NAME在全局变量之前查找局部变量,而LOAD_GLOBAL直接查找全局变量。LOAD_NAME主要用于类语句,但在没有global声明的情况下,编译器也会在模块级发出用于全局变量查找的LOAD_NAME。
早在Python3.4之前,当查找失败时,LOAD_GLOBAL通常会说global name 'whatever' is not defined,而LOAD_NAME通常会说name 'whatever' is not defined。当有人认为“全局”对于某些人错误输入局部变量名的情况感到困惑时,这就得到了变化。
你上的是Python 2.7。当您在顶层对一个不存在的名称运行变量查找时,您会得到LOAD_NAME错误消息,但是在一个函数中,您会得到LOAD_GLOBAL错误消息,该消息在Python2上仍然是“全局的”。
发布于 2021-02-07 05:58:34
这似乎发生在函数或方法的上下文中,其中LEGB停留在G(LEGB),它已经知道构建器,并在该范围内退出/抱怨。
例如,复制:
>>> def hi():
... sdrent
...
>>> hi()
NameError: global name 'sdrent' is not defined或者更简单:
>>> (lambda: sdrent)()
NameError: global name 'sdrent' is not defined在一种课堂方法中:
>>> class X:
def __call__(_): sdrent
>>> X()()
NameError: global name 'sdrent' is not definedhttps://stackoverflow.com/questions/66084971
复制相似问题