最近遇到了一个还算常见的错误提示:local variable 'xxx' referenced before assignment

字面上的意思就是该变量在引用前还未定义,于是我去代码里找到了这个变量,发现它是在for循环里定义,在for循环外引用的。第一时间想到C++中for循环里定义的变量是局部变量,会不会python也是一样呢?可是一查资料发现,python的机制并非如此:python中for、if等语句不会引入新的定义域,就连for 后面跟着的变量(比如i)在循环结束后都不会被删除;除非 for 循环的序列为空,变量i才不会被赋值。(比如,for i in []:)

而且即便是没先对该变量定义(也就是赋值),报错内容也应该是name 'xxx' is not defined

看来for循环是冤枉的,只好百度一下遇到的问题详情了,原来这类问题是由于在内部函数修改同名全局变量之前调用了变量名称(如print sum),就会引发Unbound-LocalError,也就是我们遇到的错误。

于是我仔细研究了一下代码,发现确实有一个同名的全局变量,然后在当前函数中对其进行了修改。然而接下来的事就更加蹊跷了:我在引用该变量前,就已经在上文提到的for循环中重新给它赋值了,那么它已然变为局部变量,怎么还会报错呢?

经过我的苦思冥想,终于发现了猫腻——原来我用到了多线程!(原谅我程序写了太久,记忆有些模糊了)

在主函数中,定义了一个全局变量sign,并且由于这是获取视频流的代码,对sign的赋值语句位于while循环中:

while 1:

sign,frame=cameras.CameraViewUpdate() #frame就是每一帧的图像,sign是判断摄像头是否开启的返回值

time.sleep(0.5)

在之前的函数里也有一个局部变量sign,名字起重了(程序代码不只是一个人写的,缺乏交流啊!)

同时整个程序是用多线程运行的,主线程每隔0.5秒就会更新图像,同时也更新了sign的作用域。因此我猜想,应该是在调用函数内的局部变量sign之前,while循环刚好更新了sign,改变了其作用域,才会报错。这也能够解释,为什么这个错不是每次都会报,大多时候程序是能够正常运行的。

遗憾的是,我没能查到相关资料,没办法验证自己的猜测。反正把变量名改过来就对了。

python函数的定义域_python中多线程的变量定义域问题相关推荐

  1. python函数模块概念_python中模块和包的概念

    1.模块 一个.py文件就是一个模块.这个文件的名字是:模块名.py.由此可见在python中,文件名和模块名的差别只是有没有后缀.有后缀是文件名,没有后缀是模块名. 每个文件(每个模块)都是一个独立 ...

  2. python函数自定义教程_Python中自定义函数的教程

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

  3. python函数**什么意思_python中函数的参数是什么意思

    本文主要讲解python中函数的参数及参数的类型 默认参数def enroll(name, gender, age=6, city='Beijing'): print('name:', name) p ...

  4. python 函数参数注释_Python中函数添加注释 如何正确的为函数添加注释说明

    在前面鳄鱼君对Python的注释只是简单的提示一下,没有详细说明,在这片文章中会对Python中的一些注释方法进行说明,它非常重要. 在Python中单行注释和多行注释非常的简单: Python中文编 ...

  5. python函数参数顺序_Python 中的参数深入、取值顺序、内置函数等

    封面图片来源:沙沙野 内容概览动态参数 形参的顺序问题 名称空间与作用域 加载顺序 取值顺序 内置函数 高阶函数 关键字 global 关键字 nonlocal 动态参数前面文章提到,形参有三种:位置 ...

  6. python函数返回值_Python中函数的返回值示例浅析

    前言: 前面我们介绍了简单的介绍了函数和函数的参数,今天我们来说一下Python中函数的返回值. 函数的返回值:函数运算的结果,需要进一步的操作时,给一个返回值return用来返回函数的结果,如果没有 ...

  7. python函数isdisjoint方法_Python中的isdisjoint()函数

    在本文中,我们将学习如何在set()数据类型上实现isdisjoint()函数.此函数检查作为参数传递的集合是否具有任何共同的元素.如果找到任何元素,则返回False,否则返回True. 除了设置输入 ...

  8. python函数默认参数_Python中函数的默认参数问题

    前几天,运营反馈了一个BUG,某些数据在写入数据库后,其时间字段出现异常,与当前时间相差较多. 由于代码是不是我写的,所以开始一遍阅读代码一遍排查问题. 在主流程中,仅仅发现了一个对时间赋值的语句,并 ...

  9. [转载] python函数isdisjoint方法_Python中的isdisjoint()函数

    参考链接: Python Set isdisjoint() 在本文中,我们将学习如何在set()数据类型上实现isdisjoint()函数.此函数检查作为参数传递的集合是否具有任何共同的元素.如果找到 ...

最新文章

  1. C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承与虚继承
  2. 【Paddle】Anaconda安装PaddlePaddle和PaddleX教程
  3. 《C语言编程初学者指南》一1.9 本章小结
  4. 互联网、SaaS的技术挑战与机遇
  5. Linux下执行程序出现 Text file busy 时的解决办法。
  6. hana 查看表字段_hana 查看表数据库
  7. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
  8. 计算机组成与体系结构重点(四川大学软件学院)
  9. 手机号码好坏什么软件测试,测试你的手机号码好不好(很准哦)
  10. 新浪微博开发平台试用
  11. Java 并发 随笔 1-初尝并发
  12. 读书笔记 《一生的计划》
  13. 表不存在,但是可以查询、删除(没有返回结果,一直hang住)
  14. LeetCode知识点总结 - 347
  15. html下拉菜单制作方法,CSS3制作Dropdown下拉菜单的方法
  16. 【Tcl学习笔记】第1章 Tcl和Tk概览-hello world!
  17. 【java】poi word模板生成报告后打不开问题
  18. 服务器系统挂安卓游戏吗,云服务器可以挂游戏吗
  19. iOS 后台运行 Background Task与Background Mode
  20. 分布式系统:FLP Impossibility/CAP原理

热门文章

  1. Keras构建前馈神经网络并使用callbacks输出acc以及loss曲线(训练接、验证集)及效果可视化
  2. Badread: simulation of error-prone long reads Badread:模拟容易出错的长读断
  3. Real-Time DNA Sequencing from Single Polymerase Molecules
  4. LoRDEC: a tool for correcting errors in long sequencing reads 纠正长序列读取错误的工具
  5. oracle linux telnet,linux如何开启telnet服务
  6. python 播放 wav 文件
  7. 重温目标检测--SSD
  8. Linux下批量重命名文件名为数字索引编号(0~N.xxx)的方法
  9. CNN光流计算--FlowNet: Learning Optical Flow with Convolutional Networks
  10. Kaldi不支持Cuda10_1版本