python global变量声明_Python global变量

偶然遇到一次“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下面,但是也仍然是针对全局而言,所以这个时候修改全局变量是全局的,不需要担心出现一个新的局部变量~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值