打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PYTHON 中 global 关键字的用法

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

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

 

案例一:

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

  1. #error case
  2. param = 10
  3. def test():
  4. if (param == 10):
  5. print("equal 10")
  6. else:
  7. print("not equal 10")
  8. def main():
  9. global param
  10. param = "hello world"
  11. test()
  12. if __name__ == "__main__":
  13. main()

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

接下来就分析原因。

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

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

  1. #error case
  2. param = 10
  3. def test():
  4. if (param == 10):
  5. print("equal 10")
  6. else:
  7. print("not equal 10")
  8. def main():
  9. global param
  10. param = "hello world"
  11. if __name__ == "__main__":
  12. main()
  13. test()

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

 

案例二:

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

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

“param_value:10                param_id:140704526292288”。

  1. param = 10
  2. def main():
  3. print("param_value:%d\t param_id:%d" %(param, id(param)))
  4. if __name__ == "__main__":
  5. main()

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

  1. #error case
  2. param = 10
  3. def main():
  4. print("param_value:%d\t param_id:%d" %(param, id(param)))
  5. global param
  6. param = 6
  7. print("param_value:%d\t param_id:%d" %(param, id(param)))
  8. if __name__ == "__main__":
  9. main()

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

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

 

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

  1. param = 10
  2. def test():
  3. print("param_value:%d\t param_id:%d" %(param, id(param)))
  4. if (param == 10):
  5. print("equal 10")
  6. else:
  7. print("not equal 10")
  8. def main():
  9. global param
  10. print("param_value:%d\t param_id:%d" %(param, id(param)))
  11. param = 6
  12. print("param_value:%d\t param_id:%d" %(param, id(param)))
  13. test()
  14. if __name__ == "__main__":
  15. print("param_value:%d\t param_id:%d" %(param, id(param)))
  16. main()

输出结果为

  1. param_value:10 param_id:140704526292288
  2. param_value:10 param_id:140704526292288
  3. param_value:6 param_id:140704526292160
  4. param_value:6 param_id:140704526292160
  5. not equal 10

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
初识 Python: global 关键字 | Linux 中国
Python中变量的作用域详解
变量作用域
Python入门常识【入门必学】
Python语法基础
python全局变量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服