一、报错含义:

val=9
def test():
print(val)
val = 6
print(val)
test()

翻译:本地变量xxx引用前没有定义。

二、报错原因

这是Python变量作用域的问题的问题导致的:

  1. 内部函数,不修改全局变量可以访问全局变量
  2. 内部函数,修改同名全局变量,则python会认为它是一个局部变量
  3. 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
val=9  #val现在是全局变量
def test():
print(val) #引用局部变量,但局部变量未在函数内定义,报局部变量未定义的error
val = 6 #函数内,修改了同名全局变量,则变量val会被认为是局部变量,所以在上一句“print(val)”引用该变量时,被认为是局部变量的val,又没有在引用前定义,所以Unbound-LocalError
print(val)
test()

三、解决方法

如果想在函数里修改同名全局变量的值之前引用该变量,就需要在函数内引用前用global关键字将被认为是局部的变量定义为全局变量。如下:

val=9
def test():
global val #将局部变量再次定义为全局变量
print(val) #可以直接引用全局变量
val = 6 #修改了同名全局变量,变量val会被认为是局部变量,但是在“print(val)”引用该变量之前,将变量又再次定义为全局变量,所以可能正确被引用,且修改的是全局同一个变量
print(val)
test()
print(val) #全局变量已在函数内被修改

打印结果:

9
6
6

如果只是想在函数内使用同名变量,而不改变函数外全局变量的值,则直接在函数内引用该变量前,初始化即可。如下:

val=9
def test():
val = 0 #定义局部变量val
print(val) #引用局部变量
val = 6 #修改局部变量,不会影响到全局变量的值
print(val) #引用局部变量
test()
print(val) #引用全局变量,不受函数内的局部变量影响

打印结果:

0
6
9

最新文章

  1. 网络神器Greasemonkey(油猴子)使用方法简介+脚本分享【转载】
  2. 使用html和css的一些经验
  3. jQueryMobile控件之ListView
  4. ASP.NET 2.0 异步页面原理浅析 [1]
  5. 17) JMS: java Message Service(Java消息服务)
  6. html实现层叠加
  7. HDU-4675 GCD of Sequence 数学
  8. 一步步写STM32 OS【三】PendSV与堆栈操作
  9. (转)Spring 读书笔记-----使用Spring容器(一)
  10. ASP.NET项目中使用CKEditor +CKFinder 实现上传图片
  11. CC_CALLBACK之间的区别
  12. 【Java每日一题】20170308
  13. 谷歌广告Admob在cocos2dx上通过回调实现底部Banner
  14. MACD指标
  15. 关于Mysql5.7高版本group by新特性报错
  16. Java集合必会14问(精选面试题整理)
  17. Intel 82599网卡异常挂死原因
  18. appendChild简单表格的增删改查
  19. 使用fiddler抓手机包遇到问题
  20. 远程连接mysql root账号报错:2003-can't connect to MYSQL serve(转)

热门文章

  1. 【SCOI2016】背单词
  2. vue+elmentUI项目的正则判断
  3. 2. 在TCGA中找到并下载意向数据
  4. Docker笔记6:Docker 常见命令及镜像管理
  5. CMD/ENTROYPOINT区别
  6. linux配置定时任务cron/定时服务与自启动
  7. C和C++区别——前置自增与后置自增
  8. 如何轻松使用 C 语言实现一个栈?​
  9. 解决python的requests库在使用过代理后出现拒绝连接的问题
  10. PHP-FPM包的安装与配置 转