未定义 NameError 名称

当你尝试使用未初始化的变量,方法或函数时(至少不是之前),会引发此问题。换句话说,当找不到请求的本地或全局名称时会引发它。你可能错过了对象的名字或者忘记了什么。也许它在另一个范围内。我们将介绍具有单独示例的内容。

它根本没有在代码中定义

你可能忘记初始化它,特别是如果它是常量

foo   # This variable is not defined
bar() # This function is not defined

也许它稍后定义:

baz()

def baz():
    pass

或者它不是 imported:

#needs import math

def sqrt():
    x = float(input("Value: "))
    return math.sqrt(x)

Python 范围和 LEGB 规则:

所谓的 LEGB 规则谈论 Python 范围。它的名称基于不同的范围,按相应的优先级排序:

Local → Enclosed → Global → Built-in.
  • L ocal:未声明为全局变量或在函数中赋值的变量。
  • E nclosing:在包含在另一个函数内的函数中定义的变量。
  • G lobal:变量声明为全局变量,或者在文件的顶层指定。
  • B uilt-in:在内置名称模块中预先分配的变量。

举个例子:

for i in range(4):
    d = i * 2
print(d)

d 是可访问的,因为 for 循环没有标记新范围,但如果确实如此,我们就会出现错误,其行为类似于:

def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)

Python 说 NameError: name 'd' is not defined