Python 错误 NameError: name 'X' is not defined
Python“NameError: name is not defined”发生在我们试图访问一个未定义的变量或函数时,或者在它被定义之前。
要解决该错误,需要确保我们没有拼错变量名并在声明后访问它。
确保你没有拼错变量或函数
下面是产生上述错误的示例代码。
employee = {
'name': 'Jiyik',
'age': 30,
}
# ⛔️ NameError: name 'Employee' is not defined. Did you mean: 'employee'?
print(Employee) # 👈️ 拼写错误的变量名
问题是我们拼错了变量名。 请注意,变量、函数和类的名称区分大小写。
要解决这种情况下的错误,我们必须正确拼写变量名。
employee = {
'name': 'Jiyik',
'age': 30,
}
print(employee)
'X' is not defined 错误的常见原因
出现 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
代码示例导致“NameError: function is not defined”错误,因为我们试图在函数声明之前调用它。
要解决该错误,请在声明变量后移动调用函数或访问变量的行。
# ✅ 1) 声明函数或变量
def do_math(a, b):
return a + b
# ✅ 2) 之后访问它
print(do_math(15, 15)) # 👉️ 30
请注意,我们还必须在类声明后实例化类或调用类方法。
使用变量时也是如此。
# ⛔️ NameError: name 'variable' is not defined.
print(variable)
variable = 'jiyik.com'
确保将访问变量的行移到声明它的行下方。
variable = 'jiyik.com'
print(variable) # 👉️ jiyik.com
忘记用单引号或双引号将字符串括起来
错误的另一个原因是忘记将字符串用单引号或双引号引起来。
def greet(name):
return 'Hello ' + name
# ⛔️ NameError: name 'Fql' is not defined. Did you mean: 'slice'?
greet(Fql) # 👈️ 忘记用引号括起字符串
greet 函数期望用字符串调用,但我们忘记将字符串用引号引起来,因此发生了名称“X”未定义的错误。
当将字符串传递给
print()
函数而不用引号将字符串引起来时,也会发生这种情况。
要解决该错误,请将字符串括在引号中。
def greet(name):
return 'Hello ' + name
greet('Fql')
使用内置模块而不导入它
如果我们使用内置模块而不导入它,也会导致“NameError: name is not defined”。
# ⛔️ NameError: name 'math' is not defined
print(math.floor(15.5))
我们使用 math 模块而不先导入它,所以 Python 不知道 math 指的是什么。
“NameError: name 'math' is not defined”意味着我们正在尝试访问 math 模块上的函数或属性,但在访问该属性之前我们还没有导入模块。
要解决该错误,请确保导入我们正在使用的所有模块。
import math
print(math.floor(15.5)) # 👉️ 15
import math
行是必需的,因为它将 math 模块加载到我们的代码中。
模块只是函数和类的集合。
我们必须先加载模块,然后才能访问其成员。
忘记用引号将字典的键括起来
如果我们有一本字典而忘记将其键用引号括起来,也会导致该错误。
employee = {
'name': 'Jiyik',
# ⛔️ NameError: name 'age' is not defined
age: 30 # 👈️ 字典键未包含在引号中
}
除非字典中有数字键,否则请确保将它们用单引号或双引号引起来。
employee = {
'name': 'Jiyik',
'age': 30
}
尝试从外部访问作用域变量
如果我们尝试从外部访问范围变量,也会发生该错误。
def get_message():
message = 'jiyik.com' # 👈️ 函数中声明的变量
return message
get_message()
# ⛔️ NameError: name 'message' is not defined
print(message)
message 变量是在 get_message
函数中声明的,因此无法从外部范围访问它。
如果必须从外部访问变量,最好的解决方法是在外部作用域中声明该变量。
# 👇️ 在外部范围内声明变量
message = 'hello world'
def get_message():
return message
get_message()
print(message) # 👉️ "hello world"
在这种情况下,另一种方法是从函数返回值并将其存储在变量中。
def get_message():
message = 'jiyik.com'
return message
result = get_message()
print(result) # 👉️ "hello world"
另一种选择是将变量标记为全局变量。
def get_message():
# 👇️ 将 message 标记为全局
global message
# 👇️ change its value
message = 'hello world'
return message
get_message()
print(message) # 👉️ "hello world"
请注意
,通常应避免使用global
关键字,因为它会使我们的代码更难阅读和推理。
试图访问在嵌套函数中声明的变量
如果我们尝试从外部函数访问在嵌套函数中声明的变量,我们可以将该变量标记为非局部变量。
def outer():
def inner():
message = 'jiyik.com'
print(message)
inner()
# ⛔️ NameError: name 'message' is not defined
print(message)
outer()
内部函数声明了一个名为 message 的变量,但我们尝试从外部函数访问该变量并得到“name message is not defined”错误。
为了解决这个问题,我们可以将消息变量标记为非局部变量。
def outer():
# 👇️ 初始化 message 变量
message = ''
def inner():
# 👇️ 将 message 标记为 nonlocal
nonlocal message
message = 'jiyik.com'
print(message)
inner()
print(message) # 👉️ "jiyik.com"
outer()
nonlocal
关键字允许我们使用封闭函数的局部变量。
请注意
,我们必须在外部函数中初始化消息变量,但我们能够在内部函数中更改它的值。
如果我们不使用 nonlocal
语句,对 print()
函数的调用将返回一个空字符串。
def outer():
# 👇️ 初始化 message 变量
message = ''
def inner():
# 👇️ 在内部范围内声明 message
message = 'hello world'
print(message)
inner()
print(message) # 👉️ ""
outer()
在类定义之前访问它
当我们在定义类之前访问类时,也会发生该错误。
# ⛔️ NameError: name 'Employee' is not defined
emp1 = Employee('jiyik', 100)
class Employee():
def __init__(self, name, salary):
self.name = name
self.salary = salary
def get_name(self):
return self.name
要解决该错误,请将实例化行移至类声明下方。
class Employee():
def __init__(self, name, salary):
self.name = name
self.salary = salary
def get_name(self):
return self.name
emp1 = Employee('jiyik', 100)
print(emp1.name) # 👉️ jiyik
如果我们正在使用来自第三方库的类,则必须先导入该类才能使用它。
请注意在 try/except 块中使用 import 语句
在 try/except
块中使用 import
语句时也可能发生该错误。
try:
# 👉️ 此处的代码可能会引发错误
import math
result = math.floor(15.5)
except ImportError:
math.floor(18.5)
print(math.floor(20.5))
该代码示例有效,但是,如果 import
语句之前的某些代码引发错误,则该模块将不会被导入。
这是一个问题,因为我们正在 except 块中和 try/except
语句之外访问模块。
相反,将导入语句移至文件顶部。
# ✅ 将 import 语句移动到文件顶部
import math
try:
result = math.floor(15.5)
except ImportError:
math.floor(18.5)
print(math.floor(20.5))
总结
要解决 Python “NameError: name is not defined”,请确保:
- 我们没有访问不存在的变量。
- 我们不会在声明变量、函数或类之前访问它。
- 我们没有拼错变量、函数或类的名称(名称区分大小写)。
-
我们没有忘记用引号括起一个字符串,例如
print(hello)
。 - 我们没有忘记用引号将字典的键括起来。
- 如果不先导入内置模块,就不会使用它们。
- 我们不是从外部访问作用域变量。 例如,在函数中声明一个变量并试图从外部访问它。
相关文章
Python for 循环中的下一项
发布时间:2023/04/26 浏览次数:179 分类:Python
-
本文讨论了 Python 中的 for 循环以及如何通过使用 for 循环和示例来跳过列表的第一个元素。
Python While 循环用户输入
发布时间:2023/04/26 浏览次数:148 分类:Python
-
我们可以在 while 循环中使用 input() 函数来输入数据,直到在 Python 中满足某个条件。
在 Python 中将整数转换为罗马数字
发布时间:2023/04/26 浏览次数:87 分类:Python
-
本篇文章将介绍在 Python 中将整数转换为罗马数字。以下是一个 Python 程序的实现,它将给定的整数转换为其等效的罗马数字。
在 Python 中将罗马数字转换为整数
发布时间:2023/04/26 浏览次数:144 分类:Python
-
本文讨论如何在 Python 中将罗马数字转换为整数。 我们将使用 Python if 语句来执行此操作。 我们还将探讨在 Python 中将罗马数字更改为整数的更多方法。
在 Python 中读取 gzip 文件
发布时间:2023/04/26 浏览次数:70 分类:Python
-
本篇文章强调了压缩文件的重要性,并演示了如何在 Python 中使用 gzip 进行压缩和解压缩。
在 Python 中锁定文件
发布时间:2023/04/26 浏览次数:141 分类:Python
-
本文解释了为什么在 Python 中锁定文件很重要。 这讨论了当两个进程在没有锁的情况下与共享资源交互时会发生什么的示例,为什么在放置锁之前知道文件状态很重要,等等
在 Python 中将 PDF 转换为文本
发布时间:2023/04/26 浏览次数:196 分类:Python
-
在本教程中,我们将学习如何使用 Python 使用 PyPDF2、Aspose 和 PDFminer 将 PDF 文档转换为文本文件。
在 Python 中创建临时文件
发布时间:2023/04/26 浏览次数:53 分类:Python
-
本文讲解了tempfile库函数的四个子函数:TemporaryFile、NamedTemporaryFile、mkstemp、TemporaryDirectory。 每个部分都提供了适当的程序,以简化对概念的理解。