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

报错原因

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

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

基本类型

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

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

global External _variable#外部变量


此时程序很和谐,函数内部为本地变量,函数外部为外部变量。

有赋初值,也有其他操作

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

nonlocal External _variable#外部变量


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

非基本类别

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

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

External _variable


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

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

External _variable += 2


没有其他操作:因为函数内有赋值操作,此时程序认为two为本地变量。

print


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

其他操作在赋值操作前

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


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

[转]python3_unboundlocalerror报错原因相关推荐

  1. 闪退没由报错_秉承工匠精神,3步定位飞桨报错原因,你也来试试?

    点击左上方蓝字关注我们 [故事的开始-]小张是一名AI算法攻城狮,听闻飞桨乃国产开源深度学习框架之光,心想炎黄子孙当自强,用自己的深度学习框架,实现中国的AI梦--他尝试在的笔记本上使用飞桨搭建线性回 ...

  2. mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?

    三菱MR-JE-B驱动器报错,导致报错原因37.1参数设置范围异常?最近海蓝机电工程师们在做一个项目,做的是三菱MR-JE-B驱动器.工程师们在实操这个项目过程中遇到各种问题,其中就像驱动器报错的问题 ...

  3. AntD 官网样例 InputRef报错原因

    在官网可编辑表格typescript样例里 const inputRef = useRef<InputRef>(null); InputRef项目报错原因是ant design的版本问题! ...

  4. IndexError: list index out of range--Python报错原因及解决办法

    报错原因 一.括号里面的索引index超出范围 例如:要查找最后一个明星的名字'Hannah Quinlivan',Index输入为4.在Python中,第四个元素的索引为3,因为索引是从0开始的.如 ...

  5. python导入requests库一直报错原因总结_python pip 安装库文件报错:pip install ImportError: No module named _internal...

    centos6,python3,通过pip安装pycurl出现报错提示 Centos6.7系统,python3.6.7,通过 pip 安装pycurl出现报错: __main__.Configurat ...

  6. [ScyllaHide] 04 ScyllaHide配置报错原因定位

    [ScyllaHide] 文章列表-看雪地址: 00 简单介绍和使用 01 项目概览 02 InjectorCLI源码分析 03 PEB相关反调试 04 ScyllaHide配置报错原因定位 05 S ...

  7. Cannot assign to read only property ‘0’ of string的报错原因之一及解决办法

    一. 需求场景 现有项目,需要对提交资料的人员进行审核,审核不过的时候向服务器提交数据,数据结构中的certificationStatus需为JSON格式 1.1 资料信息结构如下: auditFai ...

  8. python语法报错原因_python萌新最常见5大错误

    Python 小萌新最常见 5 大错误的: 1. invalid syntax 报错原因:语法错误 首先这个时候需要检查语法是否有用错,如果报错行没有发现错误,通常在相 邻行会出现问题,这个时候就要检 ...

  9. abaqus Tie python脚本报错 原因令人震惊

    原因是不同版本的abaqus 脚本的API变了,原来是master slave,现在改成main和second了 (总结,报错原因:ZZZQ).

最新文章

  1. 一些能说到点子上的课程
  2. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路(1)
  3. CSS如何修改placeholder样式
  4. 法猿生存计划--左边的管理,技术正确
  5. 开源数据库表结构文档生成器
  6. python文件读取 ,json文件的存储
  7. 使用 Mesos 管理虚拟机
  8. 聊一聊Load Average
  9. 项目集成Spring Security
  10. MySQL考试复习(知识点、练习题)
  11. HDU 3790 最短路径问题 (SPFA)
  12. 网络爬虫程序 *版本1.0.1* 修正几个问题
  13. 学python买什么书-关于 Python 的经典入门书籍有哪些?
  14. [机器学习实战] 基于概率论的分类方法:朴素贝叶斯
  15. java三角函数计算器_编程实现一个科学计算器,能够实现加减乘除,三角函数计算等。用户界面自己设计...
  16. 4大MQ消息队列的比较
  17. 流程图、数据关系绘图神器yEd
  18. ValueError: continuous format is not supported
  19. JZOJ 2679. 跨时代
  20. win 8 安装

热门文章

  1. 最小路径问题_BFS
  2. sql初学者指南_使用tSQLt框架SQL单元测试面向初学者
  3. @sql 单元测试_简单单词中使用tSQLt进行的常规SQL单元测试
  4. nlp中bpe_缓冲池扩展(BPE)–内存中OLTP:内存挑战
  5. SQL JOIN TABLES:在SQL Server中使用查询
  6. ie浏览器中 textarea 不能自动换行
  7. 五、stdout,stdoin和stderr
  8. HDU 5950 Recursive sequence(矩阵快速幂)
  9. 【XSY2307】树的难题
  10. 怎么在jquery里清空文本框的内容