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

news2024/11/16 8:19:03

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”的原因有多种:

  • 访问不存在的变量。
  • 在声明之前访问变量、函数或类。
  • 变量、函数或类的名称拼写错误(名称区分大小写)。
  • 不要将字符串用引号引起来,例如 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)
  • 我们没有忘记用引号将字典的键括起来。
  • 如果不先导入内置模块,就不会使用它们。
  • 我们不是从外部访问作用域变量。 例如,在函数中声明一个变量并试图从外部访问它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL进阶】SQL优化

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…

论文阅读笔记《Common Visual Pattern Discovery via Spatially Coherent Correspondences》

核心思想 两组点集中共有的匹配区域通常具备两个特点:1.局部的特征相似;2.特征点在空间上的分布也相似。作者将候选匹配点对作为图的节点,将两种相似性统一到边的权重来表示。通过寻找图中稠密连接的子图来寻找两个点集中的匹配区域&#xff…

2023年浙江建筑特种工(施工升降机)真题题库及答案

百分百题库提供特种工(施工升降机)考试试题、特种工(施工升降机)考试预测题、特种工(施工升降机)考试真题、特种工(施工升降机)证考试题库等,提供在线做题刷题,在线模拟考…

大数据DataX(一):DataX的框架设计和插件体系

文章目录 DataX的框架设计和插件体系 一、DataX是什么

Python客户端使用SASL_SSL连接Kafka需要将jks密钥转换为pem密钥,需要转化成p12格式再转换pem才能适配confluent_kafka包

证书生成 生成证书以及jks参考以下文章 https://blog.csdn.net/qq_41527073/article/details/121148600 证书转换jks -> pem 需要转化成p12以下转换才能适配confluent_kafka包,直接jks转pem会报错不能使用,具体参考以下文章 https://www.ngui.cc/z…

我的Android启动优化—【黑白屏优化】

简述 在Android App使用过程中,对于应用的优化是一个加分项,举个例子,打开你的App需要2秒,人家0.5秒,这就是很大的用户体验上的优化。 问题的产生 在开发中,我们在启动app的时候,屏幕会出现一…

C语言之函数

函数不可嵌套定义&#xff0c;函数之间为平行关系#include<stdio.h> //比较大小 int max(int x,int y){int z;if(x>y){zx;}else{zy;}return z;//带返回值 }//不带参数 void help(void){printf("**********hello********\n"); }int main(){int num;nummax(3,…

Kubernetes集群编排工具helm3 工作学习记录

文章目录1. helm 介绍、组件、安装和目录结构1.1 helm 介绍1.2 helm 组件1.2.1 helm2 和 helm3 的区别1.3 helm 安装1.4 helm 目录结构2. 编写一个chart 和 helm3 内置对象讲解2.1 创建编写一个chart2.1.1 创建chart,引用内置对象的变量值2.1.2 helm通过各种类型chart包安装一个…

微信上线外卖小程序“门店快送”

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 抖音入局外卖&#xff0c;微信都开始下场做外卖了&#xff0c;难道都知道这块儿特赚钱吗&#xff0c;只能说如今大环境还是不太好&#xff0c;南山必胜客都开始搞兼职了…… 2月15日&#xff0c;有…

【管理您的整个软件供应链】上海道宁与​Sonatype助力您以更安全的开源更快地交付产品

Sonatype是 美国一家开源DevOps服务供应商 支持开源组件&#xff08;中央仓&#xff09; 为开发者提供资源库管理器&#xff08;Nexus&#xff09; 帮助加速软件创新 配备Nexus产品的组织 可以做出更好的决策 更快地进行大规模创新 并且知道他们的应用程序 始终由最高质…

微电影的行业痛点有哪些?

微电影全称微型电影&#xff0c;又称微影。是指能够通过互联网新媒体平台传播&#xff08;几分钟到60分钟不等&#xff09;的影片&#xff0c;适合在移动状态、短时休闲状态下观看&#xff0c;具有完整故事情节的“微(超短)时”(几分钟-60分钟)放映、“微(超短)周期制作(7-15天…

iOS开发framework和demo 使用cocoapod方法集成三方库

使用workspace。workspace相当于项目管理&#xff0c;创建workspace形成的文件是.xcworkspace。使用 一、xcode创建workspace并放入SDKFramework文件夹内&#xff0c;如图 选择File → new→Workspace → 点击save 这时候文件夹中就多了 SDKFramework.xcworkspace 文件 1-4.p…

功率放大器在MEMS微结构模态测试研究中的应用

实验名称&#xff1a;功率放大器在MEMS微结构模态测试研究中的应用研究方向&#xff1a;元器件测试测试目的&#xff1a;随着MEMS器件在各个领域中广泛应用&#xff0c;对微结构进行模态测试获得其动态特性参数对微结构的设计、仿真、制造、以及质量控制和评价等方面具有十分重…

机器学习:self-attention

输入 编码方式&#xff1a; one-hot:word-embedding:能更明显的区分不同类别的输入 图也能看作是多个向量输入 输出 每个向量都有一个label 一整个sequence有一个label 模型自己决定有多少个label&#xff08;sequence to sequence&#xff09; 重点介绍每个vector有一个…

Qt编写视频监控系统71-外网访问摄像头等设备(获取各种信息及拉流)

一、前言 最近遇到个需求是通过外网接入摄像机或者NVR&#xff0c;通用的做法是将视频流推流到服务器&#xff0c;然后拉取rtmp视频流&#xff0c;这样就多了服务器的要求&#xff0c;而且实现的功能有限比如不能直接用onvif协议对设备获取信息和配置信息&#xff0c;还有个做…

Guitar Pro8.0吉他打谱作曲中文版有哪些新功能?

很多人在听到Guitar Pro这个名词时&#xff0c;本能反应就是跟吉他有关的软件吧&#xff0c;但是具体是什么样子&#xff0c;有什么功能我们却不一定知道的那么详细&#xff0c;下面呢&#xff0c;我们就来详细的介绍下Guitar Pro这款软件。最后&#xff0c;Guitar Pro绝对是初…

【JAVA八股文】并发相关

并发相关1. 线程状态2. 线程池3. wait vs sleep4. lock vs synchronized5. volatile6. 悲观锁 vs 乐观锁7. Hashtable vs ConcurrentHashMap8. ThreadLocal1. 线程状态 六种状态及转换 分别是 新建 当一个线程对象被创建&#xff0c;但还未调用 start 方法时处于新建状态此时…

20- Xgboost 算法参数最优化 (集成算法) (算法)

Xgboost 方式一 from xgboost import XGBClassifier model XGBClassifier(learning_rate 0.1, # 学习率&#xff0c;控制每次迭代更新权重时的步长&#xff0c;默认0.3。值越小&#xff0c;训练越慢use_label_encoderFalse,n_estimators10, # 总共迭代的次数&#xff0c;即…

英特尔研究院探索负责任的生成式AI,让AI应用真正惠及大众

ChatGPT的爆火让AI再次成为大众热议的焦点&#xff0c;作为英特尔所提出的搭建起从模拟时代到数字时代桥梁的五大“超级技术力量”之一&#xff0c;伴随着无处不在的智能化&#xff0c;AI可将无穷的数据转化为切实可行的洞察。作为半导体行业的领先企业&#xff0c;在这一前沿技…

Windows系统从权限维持角度进行应急响应

一、基本介绍 红队攻击者在对目标进行渗透利用后通常都会进行权限维持&#xff0c;以达到持续利用的目的。而作为防守方进行应急响应时&#xff0c;应该如何与技术高超&#xff08;jiaohuajianzha&#xff09;的攻击者斗智斗勇呢&#xff1f;或许可以通过本文可以找到答案。以…