unboundlocalerror python_Python问题:UnboundLocalError: local variable ‘xxx’ referenced before assignme…「建议收藏」

unboundlocalerror python_Python问题:UnboundLocalError: local variable ‘xxx’ referenced before assignme…「建议收藏」参考链接:【解析】UnboundLocalError:localvariable’xxx’referencedbeforeassignment在函数外部已经定义了变量n,在函数内部对该变量进行运算,运行时会遇到了这样的错误:主要是因为没有让解释器清楚变量是全局变量还是局部变量。【案例】如下代码片所示:deftest():ifvalue==1:a+=1returnavalue=…

大家好,又见面了,我是你们的朋友全栈君。

参考链接:

【解析】

UnboundLocalError: local variable ‘xxx’ referenced before assignment

在函数外部已经定义了变量n,在函数内部对该变量进行运算,运行时会遇到了这样的错误:

主要是因为没有让解释器清楚变量是全局变量还是局部变量。

【案例】

如下代码片所示:

deftest():if value == 1:

a+= 1

returna

value= a = 1b= test()

结果运行时就出现了上述错误。

这是因为在函数内部对变量赋值进行修改后,该变量就会被Python解释器认为是局部变量而非全局变量,当程序执行到a+=1的时候,因为这条语句是给a赋值,所以a成为了局部变量,那么在执行return a(或是print a)的时候,因为a这个局部变量还没有定义,自然就会抛出这样的错误。

那么问题就来了,出现这个问题我们就要考虑程序是按照全局变量,就是经过函数运算到函数外面还生效,还是按照局部变量在函数外生效。

第一种,当全局变量来看,就是使用global关键字,在函数内部先声明a这个变量是全局变量。代码如下:

deftest():globalaif value == 1:

a+= 1

returna

value= a = 1b= test()

这时,n就成为了全局变量,在函数内部修改该变量,也就没有问题了。

这种情况外面的a执行完函数是2,而函数返回的也是2。

第二种是当局部变量。就是这个变量只在函数内使用,那么只要在函数内把这个变量定义一下就行了

deftest():

a= 1

if value == 1:

a+= 1

returna

value= a = 1b= test()

这种情况外面的a执行完函数还是1,而函数返回的则是2。

然而我还发现一个问题,理论上python中list作为全局变量无需global声明,因为像b[0] = 2这种赋值不会有歧义。它是“明确的”,因为如果把b当作是局部变量的话,它会报KeyError,所以它只能是引用全局的b,故不需要多此一举显式声明global。

但是我在实际操作中,在函数外定义列表,在函数中多次添加值,而后在return打印出来。执行次数少没有问题,随着循环次数的增加会出现,此报错,报错信息如下:

Traceback (most recent call last):

File “C:/Users/xxxxxx/Desktop/工具/get_url2.py”, line 153, in

r_get_url_list,script_list,html_list,other_list,suffix_list = please_geturl(url,s_url)

File “C:/Users/xxxxxx/Desktop/工具/get_url2.py”, line 93, in please_geturl

if get_url_list: # 非空列表

UnboundLocalError: local variable ‘get_url_list’ referenced before assignment

这种情况困扰我很久,一直找不出问题,最后我定义了新的列表来装返回值,程序暂时不出问题了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149466.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java手机号正则表达式验证,面试必会「建议收藏」

    java手机号正则表达式验证,面试必会「建议收藏」什么是Arthas?Arthas是一款开源在线诊断工具,采用命令行交互模式,支持web端在线诊断,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。这是一款开源一年多GitHubstar2万,99%的阿里研发小哥都在用的Java终极诊断利器!相对比直接下载使用,我推荐开发者可以试一下通过IDE插件CloudToolkit中使用Arthas来实现一键远程诊断功能。得益于Arthas强大且丰富的功能,让Arthas能做的事情超乎想象。下面仅仅列举几

    2022年9月17日
    4
  • AnalyticDB for MySQL 3.0 技术架构解析

    AnalyticDB for MySQL 3.0 技术架构解析企业数据需求不断变化,近年来变化趋势日益明显,从数据的3V特性看:体积,速度和变化;BigData强调数据量,PB级以上,是静态数据。而FastData在数据量的基础上,意味着速度和和变化,意味着客户可以更加实时化、更加快速地进行数据处理。在Forrester最近的一项研究中,超过75%的…

    2022年9月17日
    3
  • 怎样在桌面建立透明框放置文件夹_雨滴桌面怎么用

    怎样在桌面建立透明框放置文件夹_雨滴桌面怎么用一、效果1、YcDock-left2.0动图是1.0版的,2.0是第二张图,懒得截动图了下载地址:2、YcDock-bottom2.0下载地址:喜欢的小伙伴点赞收藏下载吧

    2025年8月31日
    5
  • c实现set集合

    c实现set集合集合有点编程语言会带有,有的没有。但是我想redis的集合set你一定听说过或者用过。下面咱们用链表来实现set相信有了前面的基础我们可以很容易的实现set集合需要引入我的链表的list.c和list.h头文件////set.h//set////Createdbybikangon16/9/18.//Copyright(c)2016年bikang.Allri

    2022年5月9日
    53
  • 查询端口下请求总数

    查询端口下请求总数

    2021年9月8日
    62
  • eclipse如何创建java_eclipse如何创建java项目

    eclipse如何创建java_eclipse如何创建java项目eclipse创建java项目的方法:首先点击箭头所指的file选项,并新建project;然后点击项目下的src包,右键SEC,选择箭头所指的new和CLASS;最后输入框中输入class名称,勾选箭头所指的框。本教程操作环境:windows7系统、java10&&EclipseIDE2020版,DELLG3电脑,该方法适用于所有品牌电脑。相关免费学习推荐:java基础教程…

    2022年7月24日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号