python3——unboundlocalerror报错原因
大家好,又见面了,我是你们的朋友全栈君。
出现此错误,一般是因为,在调用的函数内,使用了外部变量造成的。这里先姑且不管你的目的是什么(可能是你想对这个外部变量进行一些赋值操作;也可能是你只是想创建一个本地变量,但是你不小心弄成和外部变量重名了)
报错原因
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.cn/149056.html原文链接:https://javaforall.cn
相关文章
- python3菜鸟教程笔记
- Ubuntu16.04系统查看已安装的python版本,及Python2与Python3之间切换
- pycharm配置tensorflow环境_python3.6对应的tensorflow版本
- 当同时安装Python2和Python3后,如何兼容并切换使用详解(比如pip使用)
- Python3 正则表达式
- pycharm安装python3.6_python安装教程
- 翻身了?Python3.11性能测评超3.10近64%
- python3 高斯函数
- pycharm怎么设置编码格式_python3设置编码为utf8
- Python3 编程笔记
- Python3对多股票的投资组合进行分析「建议收藏」
- ROS中cv_bridge如何用python3进行编译
- 大整数乘法python3实现
- python3 基础 廖雪峰教程笔记-1
- python3.7如何安装numpy库_python升级后第三方库
- python3.8安装matplotlib_matplotlib画图
- Vmware安装Ubuntu16.4、Ubuntu里安装python3.9、Ubuntu安装PyCharm的过程及出现的问题的解决[通俗易懂]
- python3.3使用tkinter实现猜数字游戏代码
- Anaconda python3.6版本安装[通俗易懂]
- pycharm安装dlib失败_python3.8.0安装教程