文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何解决 Python 错误 NameError: name ‘X‘ is not defined

2023-09-01 16:47

关注

Python“NameError: name is not defined”发生在我们试图访问一个未定义的变量或函数时,或者在它被定义之前。

要解决该错误,需要确保我们没有拼错变量名并在声明后访问它。


确保你没有拼错变量或函数

下面是产生上述错误的示例代码。

employee = {    'name': 'Jiyik',    'age': 30,}# ⛔️ NameError: name 'Employee' is not defined. Did you mean: 'employee'?print(Employee) # 👈️ 拼写错误的变量名

Python 错误 NameError name X is not defined

问题是我们拼错了变量名。 请注意,变量、函数和类的名称区分大小写。

要解决这种情况下的错误,我们必须正确拼写变量名。

employee = {    'name': 'Jiyik',    'age': 30,}print(employee)

‘X’ is not defined 错误的常见原因

出现 Python“NameError: name is not defined”的原因有多种:


访问不存在的变量或函数

确保我们没有访问不存在或尚未定义的变量。

# ⛔️ NameError: name 'do_math' is not definedprint(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 ' + namegreet('Fql')

使用内置模块而不导入它

如果我们使用内置模块而不导入它,也会导致“NameError: name is not defined”。

# ⛔️ NameError: name 'math' is not definedprint(math.floor(15.5))

我们使用 math 模块而不先导入它,所以 Python 不知道 math 指的是什么。

“NameError: name ‘math’ is not defined”意味着我们正在尝试访问 math 模块上的函数或属性,但在访问该属性之前我们还没有导入模块。

要解决该错误,请确保导入我们正在使用的所有模块。

import mathprint(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 messageget_message()# ⛔️ NameError: name 'message' is not definedprint(message)

message 变量是在 get_message 函数中声明的,因此无法从外部范围访问它。

如果必须从外部访问变量,最好的解决方法是在外部作用域中声明该变量。

# 👇️ 在外部范围内声明变量message = 'hello world'def get_message():    return messageget_message()print(message)  # 👉️ "hello world"

在这种情况下,另一种方法是从函数返回值并将其存储在变量中。

def get_message():    message = 'jiyik.com'    return messageresult = get_message()print(result)  # 👉️ "hello world"

另一种选择是将变量标记为全局变量。

def get_message():    # 👇️ 将 message 标记为全局    global message    # 👇️ change its value    message = 'hello world'    return messageget_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 definedemp1 = 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.nameemp1 = 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 mathtry:    result = math.floor(15.5)except ImportError:    math.floor(18.5)print(math.floor(20.5))

总结

要解决 Python “NameError: name is not defined”,请确保:

来源地址:https://blog.csdn.net/fengqianlang/article/details/129054949

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯