偶然遇到一次“global name 'aglobalname' is not defined”问题,又重新理解了一下global全局变量的用法

1. 常用情况:

按照我们常用的python全局变量的概念,只要定义了就可以在函数中使用,但其实直接使用全局变量会报错:

#usr/bin/python

#encoding=utf-8

sumAB = 0

def printSumAB(a,b):

print sumAB

sumAB = a+b

print sumAB

printSumAB(1,2)

输出错误信息:

Traceback (most recent call last):

File "/Users/name/PycharmProjects/untitled/understandGlobal.py", line 8, in

printSumAB(1,2)

File "/Users/name/PycharmProjects/untitled/understandGlobal.py", line 5, in printSumAB

print sumAB

UnboundLocalError: local variable 'sumAB' referenced before assignment

也就是说我们在函数里打印sumAB的操作是不合法的——虽然在函数外我们已经声明了一个全局的sumAB,但实际上,这样的声明的变量,在局部进行引用或修改是有问题的,我们可以通过查看变量id进行对比:

#usr/bin/python

#encoding=utf-8

sumAB = 0

print id(sumAB)

def printSumAB(a,b):

sumAB = a+b

print id(sumAB)

printSumAB(1,2)

print id(sumAB)

输出结果:

#上面打印的三次sumAB的id

140626682200208

140626682200136

140626682200208

通过上面输出两个sumAB的id可以发现,函数中的sumAB的id与我们以为的全局变量的id不同,这样操作也没有成功修改函数外sunAB的值……

2.借助global声明:

那到底要怎样引用并修改这个全局变量呢?

这个时候就需要借助global啦:

#usr/bin/python

#encoding=utf-8

sumAB = 0

print '最早的sumAB的id',id(sumAB)

def printsumAB(a,b):

global sumAB

print '初始sumAB = ',sumAB

print '初始sumAB的id = ',id(sumAB)

sumAB = a+b

print '修改后的sumAB = ',sumAB

print '修改后的sumAB的id = ',id(sumAB)

printsumAB(1,2)

print '最终的sumAB = ',sumAB

print '最终的sumAB的id = ',id(sumAB)

打印结果:

最早的sumAB的id 140430981252272

初始sumAB = 0

初始sumAB的id = 140430981252272

修改后的sumAB = 3

修改后的sumAB的id = 140430981252200

最终的sumAB = 3

最终的sumAB的id = 140430981252200

这个时候,可以发现,成功的修改了我们想要改变的全局变量(^-^)而关键点,就是要声明“global”;但是有时候为什么我们没有声明global,还是可以使用全局变量呢?

——引用全局变量时,不需要global声明;但是后面使用或者修改这个全局变量的时候,需要global声明~~~不然就会报错

3.【补充说明】

在'main'这个程序入口修改修改全局变量,就不需要再用global声明了:

#usr/bin/python

#encoding=utf-8

sumAB = 0

print '最早的sumAB的id',id(sumAB)

if __name__ == '__main__':

global sumAB

sumAB = sumAB+1

print '最终的sumAB = ', sumAB

print '最终的sumAB的id = ', id(sumAB)

输出结果:

/Users/name/PycharmProjects/virtual/bin/python /Users/name/PycharmProjects/untitled/understandGlobal.py

/Users/name/PycharmProjects/untitled/understandGlobal.py:20: SyntaxWarning: name 'sumAB' is assigned to before global declaration

最早的sumAB的id 140546367576960

global sumAB

最终的sumAB = 1

最终的sumAB的id = 140546367576936

从以上输出结果可以看出,程序运行没有报错,也成功修改全局变量sumAB,但给出了警告,表示在声明为全局变量前,它已经被赋值了……

这个时候我们去掉global声明,再试一次:

#usr/bin/python

#encoding=utf-8

sumAB = 0

print '最早的sumAB的id',id(sumAB)

if __name__ == '__main__':

# global sumAB

sumAB = sumAB+1

print '最终的sumAB = ', sumAB

print '最终的sumAB的id = ', id(sumAB)

打印结果:

最早的sumAB的id 140352440784096

最终的sumAB = 1

最终的sumAB的id = 140352440784072

没有出现报错,而且成功修改了全局变量~

个人理解是,main作为程序执行入口,本身就可以理解为是一个全局的概念,即使用在if下面,但是也仍然是针对全局而言,所以这个时候修改全局变量是全局的,不需要担心出现一个新的局部变量~

python global变量声明_Python global变量相关推荐

  1. python的静态变量声明_python“静态”变量、实例变量与本地变量的声明示例

    前言 虽然各种编程语言之间大部分语法存在共通的地方,但是在一些细节的处理上还是千差万别 才接触Python不久(之前是学Java的),实在想吐槽一下语言之间编码格式上的不统一问题,比如Java用分号分 ...

  2. python公共变量声明_Python变量声明

    繁星coding 好的,首先要做的事情.Python中没有"变量声明"或"变量初始化"这样的东西.简直就是我们所谓的"任务",但应该只是称之 ...

  3. python声明变量教程_Python定义变量

    变量就像是一个用来装东西的盒子,我们把要存储的东西放在这个盒子里面,再给这个盒子起一个名字.当我们需要用到盒子里的东西的时候,只要说出这个盒子的名字,就可以找到其中的东西了. 盒子里的东西是可以变化的 ...

  4. python 线程超时设置_python 条件变量Condition(36)

    文章首发微信公众号,微信搜索:猿说python 对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – ...

  5. python nonlocal的用法_python global和nonlocal用法解析

    这篇文章主要介绍了python global和nonlocal用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ◆global和nonloca ...

  6. python清空变量值_Python的变量 - YGH1215的个人空间 - OSCHINA - 中文开源技术交流社区...

    听完下面这首日语歌,你也差不多阅读完此文了   : ) 1. 概念 Python变量是用于存储值所在的内存位置.换句话说,python程序中的变量将数据提供给计算机进行处理. Python中的每个值都 ...

  7. python变量运算符_Python(三) 变量与运算符

    一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1,   a='1',   a=(1,2),  ...

  8. python指定变量类型_Python#160;变量类型_python教程

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  9. python不允许使用关键字作为变量名_python函数变量_python不允许使用关键字作为变量名,允许使用内置函数名作为变量名,但这会改变函数 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在python 中, ...

最新文章

  1. 分布式系统理论之两阶段提交协议
  2. kali linux状态栏显示网速
  3. CSS+jQuery/JavaScript图片切换播放
  4. pcie和usb哪个带宽高_了解数字示波器采样率和模拟带宽的规格
  5. Redis 再牛逼,也得设置密码
  6. ajax请求头cookies中传递sid,跨域请求单点登录,登录成功,但是在controller中获取的cookie与浏览器中不一致,请大神指点一二。^_^...
  7. 刚刚,华为发布全球首款 5G 基站核心芯片!
  8. mysql varbinary blob_MySQL BIT、BINARY、VARBINARY、BLOB(二进制类型)
  9. 推荐几个Python+OpenCV实战项目
  10. 快速排序(快排)——C语言实现
  11. excel宏选中单元格_从单元格引用运行Excel宏
  12. linux用sed替换字符,Linux中使用sed命令替换字符串小结
  13. 植物大战僵尸 - 修改关卡和商店金钱
  14. JMC | 基于机器学习精确预测激酶抑制剂结合模式
  15. node rimraf模块 递归删除文件夹内容
  16. 硬盘问题导致无法开机
  17. 毛远丽教授谈机器学习技术在检验医学中的新应用|专家论坛
  18. 女程序员放弃大厂年薪20万,回老家当实习老师,工作难找,后悔哭了
  19. coding期间遇到的bug记录
  20. Kettle连接MySQL数据库找不到驱动问题解决

热门文章

  1. vue设置全局拦截器
  2. 良心安利水墨 毛笔免抠元素素材网站
  3. 简易可逆加密解密算法
  4. 腾讯云图片(行为)验证码,腾讯天御验证码,前vue后python端配置。前后端分离drf下的
  5. 计算机编码不能统一怎么回事,word自动编号不能重新编号怎么回事?
  6. 东北林业大学第15届校赛(大二组) 题解
  7. 中国式富爸爸穷爸爸—富爸爸如何教育大学毕业生
  8. 关于计算机的英语手抄报简单,英语手抄报图片大全简单又漂亮少字
  9. php获取重定向post数据,使用POST数据进行PHP重定向
  10. python常用函数汇总