local variable referenced before assignment 原因及解决办法

2023-12-29 23:38

本文主要是介绍local variable referenced before assignment 原因及解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一句话,在函数内部更改全局变量就会出现此错误
直接给出两个例子说明为什么出现这一错误及如何避免:

a= 3
def temp():print(a)
temp() #输出的结果为3

在上面一段代码中,函数temp的操作是打印a的值,但函数内部并没有对a进行定义,此时系统会在外部寻找a的值,而我们在函数外部给a赋值为3,这种在函数外部赋值的变量被称为全局变量(global variable),这种情况下运行函数temp不会出错,但是下面一种情况就会报错:

a= 3
def temp():print(a)a+=1
temp() #会报错, UnboundLocalError: local variable 'a' referenced before assignment

原因是我们定义的函数temp内部第一次打印a是调用的全局变量,而打印后却令a=a+1,在函数内部试图更改全局变量a导致错误。如果我们确实希望通过函数temp打印全局变量a,并且将a的值加1,那么就要在函数内部声明全局变量:

a= 3
def temp():global a #声明我们在函数内部使用的是在函数外部定义的全局变量aprint(a)a+=1
temp() #调用temp函数,不会再报错了
a #此时就会发现a的值确实变成4

总结:不要在函数内部改变全局变量的值,如果确实想改变全局变量的值(以a为例),那么需要在函数内部首先声明,即加上global a这一行代码。

要解决标题的问题上面的内容已经足够了,下面是一些关于全局变量和局部变量的补充:
与全局变量相对,定义在函数内部的变量称为局部变量(local variable),局部变量只在函数内部起作用,例如:

def temp():a= 3print(a)
temp() #输出结果为3
print(a) #出错,NameError: name 'a' is not defined提示a未定义

这一次我们没有在函数外部定义a,而仅在函数temp内部定义a=3,此时a就是局部变量,所以在函数外部是无法访问a的。

再看一个例子:

a= 3 #全局变量
def temp():a= 4 #局部变量print(a)
temp() #返回4,因为在函数内部a=4
print(a)#返回3,因为在函数外部a被赋值为3

把上面一段代码与本文最开头的一段代码对比就会发现,在函数内部访问变量a时,系统首先在函数内部找有没有定义局部变量a,如果找不到,那么就会在函数外部寻找有没有定义全局变量a,都找不到才会报错。而如果在函数外部访问变量a,那么只会寻找全局变量,如果没有就会报错,而不管我们有没有在某个函数内部定义局部变量a。

这篇关于local variable referenced before assignment 原因及解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551057

相关文章

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa