python语句关键词用法_PYTHON 中 global 关键字的用法

之前写函数的时候,由于传参实在太多,于是将某个数组定义为全局变量,在函数中直接使用。

可是在使用过程中发现会报错,原因是在另一个调用函数中,该全局变量的类型被修改了,那这边正好彻底用几个例子来理清一下python中global关键字可以起到的作用。

案例一:

先说我碰到的问题(并没有贴上源代码,下面的例子是自己抽象出一个方便大家理解的小case)程序大概就是这样

#error case

param = 10

def test():

if (param == 10):

print("equal 10")

else:

print("not equal 10")

def main():

global param

param = "hello world"

test()

if __name__ == "__main__":

main()

结果这个程序的输出并不符合我一开始的预期,我预期是输出 “equal 10”,但结果是 “not equal 10”

接下来就分析原因。

因为在 main() 函数中,param 先被当做全局引用,并修改了他的类型,从 int 型变成了 str 型,因此在后面调用 test() 函数的时候,判定 param==10 结果为false。

即使把 test() 函数放到以下位置,也不会改变输出结果。

#error case

param = 10

def test():

if (param == 10):

print("equal 10")

else:

print("not equal 10")

def main():

global param

param = "hello world"

if __name__ == "__main__":

main()

test()

正确的做法,应该只能通过传参,并且对于全局变量不要随意修改。反正 PYTHON 在函数外定义的变量均当做全局变量来处理,也不需要画蛇添足加上 global 关键字。只有当确认需要对 global 变量做出修改的时候,再使用 global 关键字!

案例二:

接下来通过其他的 global 的例子,进一步加深理解。

PYTHON 变量默认是全局变量,在不申明 global param 的情况下,即下例,程序可以正确输出

“param_value:10                param_id:140704526292288”。

param = 10

def main():

print("param_value:%d\t param_id:%d" %(param, id(param)))

if __name__ == "__main__":

main()

接下来测试当 param 被 global 申明,结果就有些不一样。

#error case

param = 10

def main():

print("param_value:%d\t param_id:%d" %(param, id(param)))

global param

param = 6

print("param_value:%d\t param_id:%d" %(param, id(param)))

if __name__ == "__main__":

main()

依然是申明了变量,但是在 global 之前获取了 param 的值和 id。

这种情况下,程序会报 syntax error,理由是 “name 'param' is used prior to global declaration”,即变量在定义之前就被使用。而只要变量在这个函数块内被申明,他的作用域就是整个函数,如果在申明之前被引用,那就会报错。

用这个例子应该能比较清楚的说明 global 的用法。

param = 10

def test():

print("param_value:%d\t param_id:%d" %(param, id(param)))

if (param == 10):

print("equal 10")

else:

print("not equal 10")

def main():

global param

print("param_value:%d\t param_id:%d" %(param, id(param)))

param = 6

print("param_value:%d\t param_id:%d" %(param, id(param)))

test()

if __name__ == "__main__":

print("param_value:%d\t param_id:%d" %(param, id(param)))

main()

输出结果为

param_value:10 param_id:140704526292288

param_value:10 param_id:140704526292288

param_value:6 param_id:140704526292160

param_value:6 param_id:140704526292160

not equal 10

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值