python3——unboundlocalerror报错原因

python3——unboundlocalerror报错原因出现此错误,一般是因为,在调用的函数内,使用了外部变量造成的。这里先姑且不管你的目的是什么(可能是你想对这个外部变量进行一些赋值操作;也可能是你只是想创建一个本地变量,但是你不小心弄成和外部变量重名了)报错原因0.首先必须假设你没有在调用函数内部开头使用globalExternal_variable#外部变量或者nonlocalExternal_variable#外部变量(因为…

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

出现此错误,一般是因为,在调用的函数内,使用了外部变量造成的。这里先姑且不管你的目的是什么(可能是你想对这个外部变量进行一些赋值操作;也可能是你只是想创建一个本地变量,但是你不小心弄成和外部变量重名了)

报错原因

0.首先必须假设你没有在调用函数内部开头使用global External _variable#外部变量或者nonlocal External _variable#外部变量(因为使用了这两条语句,程序就只会认为External _variable为外部变量,也就不可能会报错了)
1.在调用函数内部,对这个外部变量进行赋值,那么此时程序认为你其实是在对一个与外部变量重名的本地变量进行赋值操作。
2.既然是对本地变量进行赋值操作,那么其他操作(这些操作需要此本地变量已经赋过初值了)就必须在赋值操作语句以后出现。

3.但如果其他操作在赋值操作之前出现,那么程序报错。
4.还有一种特殊情况是External _variable += 2,因为它既是赋值操作(所以程序判定此变量为内部变量),也属于其他操作,因为它需要此变量赋过初值。这种情况出现也会报错。

函数内,不进行赋值操作,直接使用外部变量的引用时,是没有问题的,比如进行print操作。

基本类型

当这个外部变量的类别是基本类型(比如int,float,str等)。
函数内部的操作有如下几种情况:

只有赋初值,没有其他操作

two = 0
def add_two():
    two = 2
    print(two)
add_two()
print(two)

这里写图片描述
此时程序很和谐,函数内部为本地变量,函数外部为外部变量。

有赋初值,也有其他操作

且其他操作没有在赋初值操作之后出现。

two = 0
def add_two():
    two += 2
    print(two)
add_two()
print(two)

这里写图片描述
此时程序认为two为本地变量,但two连初值都没有,就让人家进行+=操作,那肯定会报错。

非基本类别

当这个外部变量的类别是非基本类型(比如list,dict等)。
函数内部的操作有如下几种情况:

没有赋初值操作,有其他操作

two = [1,2]
def add_two():
    two.append(3)
    print(two)
add_two()
print(two)

这里写图片描述
打印结果可以看出,程序认为two为外部变量,所以执行完函数,外部变量也改变了。

只有赋初值,不管有没有其他操作

two = [1,2]
def add_two():
    two = [1,2,3]
    print(two)
add_two()
print(two)

这里写图片描述
没有其他操作:因为函数内有赋值操作,此时程序认为two为本地变量。

two = [1,2]
def add_two():
    two = [1,2,3]
    two.append(4)
    print(two)
add_two()
print(two)

这里写图片描述
有其他操作,且顺序是对的(即赋值操作在前):因为函数内有赋值操作,此时程序认为two为本地变量。无论你有多少其他操作,操作到的只是这个本地变量而已。

其他操作在赋值操作前

two = [1,2]
def add_two():
    two.append(4)
    two = [1,2,56]
    print(two)
add_two()
print(two)

这里写图片描述
有其他操作,且顺序是错的(即赋值操作在后面):因为函数内有赋值操作,此时程序认为two为本地变量。但顺序错了,所以报错。

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

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

(0)
上一篇 2022年6月25日 下午8:00
下一篇 2022年6月25日 下午8:00


相关推荐

  • C语言大数运算-大数运算库篇

    C语言大数运算-大数运算库篇前言 通过前面的 3 篇文章我们已经实现了大数的四则运算 本篇博客我们会把这是几个个方法做成一个库文件 可以供自己日后使用 细心的读者可能意到了 每个程序都引用了 big h 但是都被注释掉了 big h 就是头文件只要将函数的声明放到该文件中 然后在其它程序中引用该文件就可以使用大数运算的方法 重复的代码我就不再写了 其实有了算法你们自己就可以实现 所以我就简单的说几句 文件命名 头文件 b

    2026年3月17日
    2
  • 基于指纹的原则,具体的音乐检索

    基于指纹的原则,具体的音乐检索

    2022年1月10日
    44
  • 从零开始学NLP(八) 隐马尔科夫模型(超详细)

    从零开始学NLP(八) 隐马尔科夫模型(超详细)1HMM 基础 PART1 时间序列数据股票价格 气温 文本 PART2 HMM 基础 HMM 作为经典的序列模型 广泛应用在各类 AI 场景中 其中 HMM 的最成名之作可以认为是语音识别领域 在深度学习流行之前 绝大部分语音识别系统都基于 HMM 模型 也算是经典中的经典了 另外 HMM 在文本领域也有着很多的应用如中文分词 除此之外 理解 HMM 对于后续学习 RNN 模型来说有着比较大的意义 因为这两者很类似 你可以简单地认为 HMM 是传统的序列模型 RNN 为基于深度学习的序列模型 学习 HMM 并不简单 其中

    2026年3月18日
    2
  • mac idea 激活码【最新永久激活】

    (mac idea 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S3…

    2022年3月26日
    1.2K
  • Android 短信验证码登录注册

    Android 短信验证码登录注册我这里主要讲解的是使用xutils进行开发的,所以在开发之前一定要先导入xutils项目包。下载链接:https://download.csdn.net/download/weixin_42497748/10754925  1.在AndroidManifest.xml里面开通权限<!–网络权限–><uses-permissionand…

    2022年7月25日
    12
  • [Elasticsearch]查询语法速查

    [Elasticsearch]查询语法速查0x01 基本语法基本语法是 GET POST http domain com you index name type1 type2 search search type count scan 注意 随着 ES 版本变化 搜索语法也有小调整 本文以 1 7 为准 全基于 rest 式 http 调用 其中 GET 方法支持在 body 传参数 search 是关键字 以此结束表示搜索行为 可以

    2026年3月18日
    1

发表回复

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

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