NameError:名称“X”未在 Python 中定义
NameError: name ‘X’ is not defined in Python
Python“NameError: name is not defined”发生在我们试图访问一个未定义或定义之前的变量或函数时。要解决该错误,请确保您没有拼错变量名并在声明后访问它。
下面是错误如何发生的示例。
employee = { 'name': 'Alice', 'age': 30, } # ⛔️ NameError: name 'Employee' is not defined. Did you mean: 'employee'? print(Employee) # 👈️ misspelled variable's name
问题是我们拼错了变量名。请注意,变量、函数和类的名称区分大小写。
要解决这种情况下的错误,我们必须正确拼写变量名。
employee = { 'name': 'Alice', 'age': 30, } print(employee)
出现 Python“NameError: name is not defined”的原因有多种:
- 访问不存在的变量。
- 在声明之前访问变量、函数或类。
- 变量、函数或类的名称拼写错误(名称区分大小写)。
- 不要将字符串用引号引起来,例如
print(hello)
. - 不将字典的键用引号引起来。
- 使用内置模块而不先导入它们。
- 从外部访问作用域变量。例如,在函数中声明一个变量并试图从外部访问它。
您需要确保的第一件事是您没有访问不存在或尚未定义的变量。
# ⛔️ NameError: name 'do_math' is not defined print(do_math(15, 15)) def do_math(a, b): return a + b
上面示例中的问题是我们试图在do_math
函数声明之前调用它。
为了解决这个错误,我们必须在声明变量之后移动调用函数或访问变量的行。
def do_math(a, b): return a + b print(do_math(15, 15)) # 👉️ 30
错误的另一个原因是忘记将字符串用单引号或双引号引起来。
def greet(name): return 'Hello ' + name # ⛔️ NameError: name 'Alice' is not defined. Did you mean: 'slice'? greet(Alice) # 👈️ forgot to wrap string in quotes
该greet
函数期望使用字符串调用,但我们忘记将字符串用引号引起来,因此发生了名称“X”未定义的错误。
print()
当将字符串传递给函数而不用引号引起来时,也会发生这种情况。要解决该错误,请将字符串括在引号中。
def greet(name): return 'Hello ' + name greet('Alice')
如果您有一本字典而忘记将其键用引号括起来,也会导致该错误。
employee = { 'name': 'Alice', # ⛔️ NameError: name 'age' is not defined age: 30 # 👈️ dictionary key not wrapped in quotes }
除非字典中有数字键,否则请确保将它们用单引号或双引号引起来。
employee = { 'name': 'Alice', 'age': 30 }
如果您使用内置模块而不导入它,也会导致“NameError: name is not defined”。
# ⛔️ NameError: name 'math' is not defined print(math.floor(15.5))
math
模块时没有先导入它,所以 Python 不知道math
指的是什么。要解决该错误,请确保导入您正在使用的所有模块。
import math print(math.floor(15.5)) # 👉️ 15
如果您尝试从外部访问范围变量,也会发生该错误。
def get_message(): message = 'hello world' # 👈️ variable declared in function return message get_message() # ⛔️ NameError: name 'message' is not defined print(message)
该message
变量在get_message
函数中声明,因此无法从外部范围访问它。
如果必须从外部访问变量,最好的解决方法是在外部作用域中声明该变量。
# 👇️ declare variable in outer scope message = 'hello world' def get_message(): return message get_message() print(message) # 👉️ "hello world"
在这种情况下,另一种方法是从函数返回值并将其存储在变量中。
def get_message(): message = 'hello world' return message result = get_message() print(result) # 👉️ "hello world"
另一种选择是将变量标记为global
.
def get_message(): # 👇️ mark message as global global message # 👇️ change its value message = 'hello world' return message get_message() print(message) # 👉️ "hello world"
global
通常应避免使用关键字,因为它会使我们的代码更难阅读和推理。如果您尝试从外部函数访问在嵌套函数中声明的变量,您可以将该变量标记为nonlocal
.
def outer(): def inner(): message = 'hello world' print(message) inner() # ⛔️ NameError: name 'message' is not defined print(message) outer()
该inner
函数声明了一个名为的变量message
,但我们尝试从该outer
函数访问该变量并得到“名称message
未定义”错误。
为了解决这个问题,我们可以将message
变量标记为nonlocal
.
def outer(): # 👇️ initialize message variable message = '' def inner(): # 👇️ Mark message as nonlocal nonlocal message message = 'hello world' print(message) inner() print(message) # 👉️ "hello world" outer()
关键字允许我们使用nonlocal
封闭函数的局部变量。
message
变量,但我们能够在函数中更改它的值。 outer
inner
如果我们不使用该nonlocal
语句,对该print()
函数的调用将返回一个空字符串。
def outer(): # 👇️ initialize message variable message = '' def inner(): # 👇️ declares message in inner's scope message = 'hello world' print(message) inner() print(message) # 👉️ "" outer()
结论
Python“NameError: name is not defined”发生在我们试图访问一个未定义或定义之前的变量或函数时。要解决该错误,请确保您没有拼错变量名并在声明后访问它。