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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 那些常见的C++、Qt基础面试题「建议收藏」

    那些常见的C++、Qt基础面试题「建议收藏」前言又到了金三银四的季节,每年这个时候都是跳槽的高峰期,在整理电脑资料的过程中发现一些之前记录的面试过程中最常提到的C++和Qt相关问题,其实都是些很基础的知识点,但是在面试过程中出镜率非常高。总结如下,暂不附答案,仅供参考。正文废话不多说,直接上题。C++基础篇1.线程同步的方式有哪些2.线程间通信如何实现3.进程间通信如何实现4.IO模型用过哪些5.IO实现的方式有哪些6.用过哪些STL7.迭代器实现怎么产生的,如何避免8.vector、list、map实现原理9.如何实现多

    2022年6月25日
    53
  • Vsftp与PAM虚拟用户

    Vsftp与PAM虚拟用户Vsftp与PAM虚拟用户使用yum安装vsftpyum install vsftpd pam pam-* db4 db4-* 创建一个保存用户及密码的文件cd /etc/vsftpd/ touch virtual_login 添加用户(一行用户一行是密码)vim  virtual_login dongnan nandong

    2025年6月23日
    5
  • LoRa无线通信设计(一)原理[通俗易懂]

    LoRa无线通信设计(一)原理[通俗易懂]LoRa无线通信设计(一)原理引言1901年,古列尔默.马可尼把长波无线电信号从Cornwall(康沃尔,位于英国的西南部)跨过大西洋传送到3200公里之外的Newfoundland(加拿大的纽芬兰岛),至此人类进入了无线通信时代。100多年来,无线技术的发展为人类带来了无线电、电视、移动电话和通信卫星。近20年,最让人们…

    2022年6月25日
    30
  • MySQL生产环境主从关系数据不同步

    MySQL生产环境主从关系数据不同步

    2021年5月29日
    94
  • Cubieboard2折腾手记(一)「建议收藏」

    Cubieboard2折腾手记(一)「建议收藏」Cubieboard折腾手记  前段时间终于是入手了一块Cubieboad2,板子的参数看着挺不错,全志A20的cpu,1G的RAM,4G的nandflash。本来就是想搞个树莓派来玩的,后来看了看,选了这个CubieBoard2,加上其他的一些配件的,参不多是400软妹币,全志的资料在网上找了下,也是不少的,对linux也算比较友好的。  废话不多说了,拿到板子后当然是装上自己最喜爱

    2022年7月22日
    9
  • Silverlight版QQ初体验

    Silverlight版QQ初体验2010年的第一天,腾讯发布了研发已久的SilverlightQQ,超炫的界面让人喜欢,希望腾讯能一直以技术为路线,以用户体验为中心做好所有的产品。下面我带着大家一起来看看SilverlightQ

    2022年7月1日
    23

发表回复

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

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