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

相关文章

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

vscode不能打开终端问题的解决办法

《vscode不能打开终端问题的解决办法》:本文主要介绍vscode不能打开终端问题的解决办法,问题的根源是Windows的安全软件限制了PowerShell的运行,而VSCode默认使用Powe... 遇到vscode不能打开终端问题,一直以为是安全软件限制问题,也没搜到解决方案,因为影响也不大,就没有管