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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PAT乙级1009. 说反话(C语言)

    PAT乙级1009. 说反话(C语言)PAT乙级真题题解目录/**1.输入含空格的字符串:用gets()读取*2.句子颠倒,单词本身字母不颠倒:*2.1从末尾单词开始输出*2.2利用指针使单词本身正序*2.3空格是单词结束的标识*/#include<stdio.h>#include<string.h>…

  • spring事务隔离级别、传播机制以及简单配置_mysql查看事务隔离级别

    spring事务隔离级别、传播机制以及简单配置_mysql查看事务隔离级别org.springframework.transactionpublicinterfaceTransactionDefinition定义符合Spring的事务属性的接口。基于类似于EJBCMT属性的传播行为定义。‎‎注意,除非启动实际的新事务,否则不会应用隔离级别和超时设置。‎‎仅‎PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEWandPROPAGATION_NESTED‎可能导致这种情况,在其他情况下指定这些设置通常没有意义。此外

  • 哈佛幸福课笔记!「建议收藏」

    哈佛幸福课笔记!「建议收藏」https://www.bilibili.com/video/BV1Gs411o71d?p=1记笔记的小天才!我应该多想想,如何将课程中的知识,运用到实际生活中,而不是只记录下来!Part1theimportanceofsilence,安静时刻的重要性,无论在家里还是,课堂,公司享受安静embracesilence(可能是这个课程最重要的)真正的学习,发生在你尝试分辨,什么是真正重要的,什么舍弃,什么保留,而这些都发生在安静自省时例子:连续不断进入迷宫的老鼠,

  • ASP.NET Session 清除

    ASP.NET Session 清除

  • java中Scanner类用法的详解[通俗易懂]

    java中Scanner类用法的详解[通俗易懂] 一  java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。首先要导入包  import java.util.Scanner;Scanner类的创建对象:   Scanner S=newScanner(System.in);   方法基本格式  hasNextXxx()  判断是否还有下一个输入项,其中Xxx可以是Int,…

  • 平均数中位数众数的实际意义_频率分布直方图平均数

    平均数中位数众数的实际意义_频率分布直方图平均数平均数:反映了一组数据的平均大小,常用来一代表数据的总体“平均水平”。中位数:像一条分界线,将数据分成前半部分和后半部分,因此用来代表一组数据的“一般水平”。众数:反映了出现次数最多的数据,用来代表一组数据的“多数水平”。平均数:与每一个数据都有关,其中任何数据的变动都会相应引起平均数的变动。主要缺点是易受极端值的影响,这里的极端值是指偏大或偏小数,当出现偏大数时,平均数将会被抬高,当出现…

发表回复

您的电子邮箱地址不会被公开。

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