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为本地变量。但顺序错了,所以报错。

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

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

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

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

(0)


相关推荐

  • macpycharm2021激活码【在线注册码/序列号/破解码】

    macpycharm2021激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 想要复制网页的文字网页不让复制_如何复制文字

    想要复制网页的文字网页不让复制_如何复制文字作者:iamlaosong当我们需要复制网页上的内容时,往往会碰到不能复制的情况,面对这个问题,不同的情况有不同的应对方法,比如禁止JavaScript运行,查看源代码,另存为网页文件等。这些方法也可以用,现在有个更通用的办法是QQ屏幕截图所带的功能,不管网页用的什么技术,能看见就可以复制,特别适合不太懂技术的人。要用QQ截图功能,QQ肯定是要登录的,然后用浏览器打开需要复制文字的网页,按QQ屏幕截图快捷键Ctrl+Alt+A选择需要复制文字的区域,在弹出的菜单中点击“翻译”或者“屏幕识图”两个按钮

    2022年10月12日
  • ADRC学习心得(持续更新)[通俗易懂]

    ADRC学习心得(持续更新)[通俗易懂]两年前第一次接触到PID觉得很高深,很神奇;后来逐渐觉得单纯的PID小儿科了,又了解到专家PID,模糊PID,神经网络PID这些改进算法,再后来又知道了ADRC,便感控制领域浩如烟海,所学不过沧海一粟。然便纵真理无穷,进一寸自有一寸的欢喜。不敢说看了几篇论文,听了几节报告,做了几次仿真,就吃透ADRC了,不过只是一些粗浅的理解,记录一行歪歪斜斜的足迹。以便回首过眼云烟之时,可以安慰自己一句,我已经飞过。一、系统有关概念1、系统的状态空间模型描述一个系统,最常用的数学模型有:微分方程传递函数状

  • 脉冲信号matlab仿真,脉冲积累matlab仿真[通俗易懂]

    脉冲信号matlab仿真,脉冲积累matlab仿真[通俗易懂]%T_7_1.m%相干积累clearallclcclfc=3e8;%speedoflightTe=100e-6;%发射脉冲宽度Be=1e6;%带宽mu=Be/Te;%调频斜率Ts=1/(2……雷达线性调频脉冲压缩的原理及其MATLAB仿真汇总_中职中专_职业教育_教育专区。LFM脉冲压缩雷达仿真线性调频(LFM)脉冲压缩雷达仿真宋萌瑞20142…

  • windows 任务计划程序_win10启动任务计划程序服务

    windows 任务计划程序_win10启动任务计划程序服务https://www.cnblogs.com/VweiweiyixiaoV/p/6611380.html

  • busybox引导linux内核_linux移植教程

    busybox引导linux内核_linux移植教程文章目录一、搭建NFS服务器二、使用BusyBox构建跟文件系统2.1修改顶层Makefile2.2busybox中文支持2.3配置busybox2.4编译busybox2.5向根文件系统添加lib库2.5.1向{rootfs}/lib目录下添加库文件2.5.2向{rootfs}/usr/lib目录下添加库文件2.6创建其他文件夹三、测试文件系统(NFS挂载)3.1设置uboot中环境变量3.2命令解析四、完善文件系统4.1创建{rootfs}/etc/init.d/rcS文件4.2

发表回复

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

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