https://www.cnblogs.com/yanfengt/p/6305542.html
一、引用
使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字。如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #! /usr/bin/python a = 1 b = [ 2 , 3 ] def func(): if a = = 1 : print ( "a: %d" % a) for i in range ( 4 ): if i in b: print ( "%d in list b" % i) else : print ( "%d not in list b" % i) if __name__ = = '__main__' : func() |
输出结果:
二、修改
使用到的全局变量,需要在函数中修改的话,就涉及到歧义问题,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #! /usr/bin/python a = 1 b = [ 2 , 3 ] def func(): a = 2 print "in func a:" , a b[ 0 ] = 1 print "in func b:" , b if __name__ = = '__main__' : print "before func a:" , a print "before func b:" , b func() print "after func a:" , a print "after func b:" , b |
输出结果:
可以看出,对于变量a,在函数func中"a = 2",因为存在既可以表示引用全局变量a,也可以表示创建一个新的局部变量的歧义,所以python默认指定创建一个新的局部变量来消除这一歧义,但对于列表b而言,"b[0] = 1"不存在这种歧义,因此直接修改了全局变量,但是如果改成了"b = [3, 4]",那么b也会变成局部变量。特别地,当在func中a = 2之前加入"if a == 1:"这一语句,脚本运行出错,因为这一语句引入了全局变量,导致了"a = 1"这一语句无法创建同名的局部变量。
因此,需要修改全局变量a,可以在"a = 2"之前加入global a声明,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #! /usr/bin/python a = 1 b = [ 2 , 3 ] def func(): global a a = 2 print "in func a:" , a b[ 0 ] = 1 print "in func b:" , b if __name__ = = '__main__' : print "before func a:" , a print "before func b:" , b func() print "after func a:" , a print "after func b:" , b |
输出结果:
结论:引用全局变量,不需要golbal声明,修改全局变量,需要使用global声明,特别地,列表、字典等如果只是修改其中元素的值,可以直接使用全局变量,不需要global声明。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2018-01-05 Arduino 433 自定义接受
2018-01-05 Arduino 433 自定义发射