首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NameError与全球NameError

NameError与全球NameError
EN

Stack Overflow用户
提问于 2021-02-07 05:53:35
回答 2查看 56关注 0票数 3

我正在尝试复制我遇到的一个bug,它显示了以下情况:

NameError:未定义全局名称“sdrent”

但是,如果打开解释器并输入sdrent,则会得到以下错误:

代码语言:javascript
复制
>>> sdrent
NameError: name 'sdrent' is not defined

NameError: global name...NameError: name...有什么区别,我将如何复制前者?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-07 06:19:43

CPython有两个用于全局变量查找的操作码,LOAD_GLOBALLOAD_NAMELOAD_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上仍然是“全局的”。

票数 2
EN

Stack Overflow用户

发布于 2021-02-07 05:58:34

这似乎发生在函数或方法的上下文中,其中LEGB停留在G(LEGB),它已经知道构建器,并在该范围内退出/抱怨。

例如,复制:

代码语言:javascript
复制
>>> def hi():
...     sdrent
...
>>> hi()
NameError: global name 'sdrent' is not defined

或者更简单:

代码语言:javascript
复制
>>> (lambda: sdrent)()
NameError: global name 'sdrent' is not defined

在一种课堂方法中:

代码语言:javascript
复制
>>> class X:
        def __call__(_): sdrent
>>> X()()
NameError: global name 'sdrent' is not defined
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66084971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档