- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
3.6 global 语句
如果需要在一个函数内修改全局变量,就使用global语句。如果在函数的顶部有global eggs这样的代码,它就告诉Python,“在这个函数中,eggs指的是全局变量,所以不要用这个名字创建一个局部变量。”例如,在文件编辑器中输入以下代码,并保存为sameName2.py:
def spam(): ❶ global eggs ❷ eggs = 'spam' eggs = 'global' spam() print(eggs)
运行该程序,最后的print()调用将输出:
spam
因为eggs在spam()的顶部被声明为global❶,所以当eggs被赋值为'spam'时❷,赋值发生在全局作用域的spam上。没有创建局部spam变量。
有4条法则,来区分一个变量是处于局部作用域还是全局作用域:
1.如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
2.如果在一个函数中,有针对该变量的global语句,它就是全局变量。
3.否则,如果该变量用于函数中的赋值语句,它就是局部变量。
4.但是,如果该变量没有用在赋值语句中,它就是全局变量。
为了更好地理解这些法则,这里有一个例子程序。在文件编辑器中输入以下代码,并保存为sameName3.py:
def spam(): ❶ global eggs eggs = 'spam' # this is the global def bacon(): ❷ eggs = 'bacon' # this is a local def ham(): ❸ print(eggs) # this is the global eggs = 42 # this is the global spam() print(eggs)
在spam()函数中,eggs是全局eggs变量,因为在函数的开始处,有针对eggs变量的global语句❶。在bacon()中,eggs是局部变量,因为在该函数中有针对它的赋值语句❷。在ham()中❸,eggs是全局变量,因为在这个函数中,既没有赋值语句,也没有针对它的global语句。如果运行sameName3.py,输出将是:
spam
在一个函数中,一个变量要么总是全局变量,要么总是局部变量。函数中的代码没有办法先使用名为eggs的局部变量,稍后又在同一个函数中使用全局eggs变量。
如果想在一个函数中修改全局变量中存储的值,就必须对该变量使用global语句。
在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错。为了看到效果,请在文件编辑器中输入以下代码,并保存为sameName4.py:
def spam(): print(eggs) # ERROR! ❶ eggs = 'spam local' ❷ eggs = 'global' spam()
运行前面的程序,会产生出错信息。
Traceback (most recent call last): File "C:/test3784.py", line 6, in <module> spam() File "C:/test3784.py", line 2, in spam print(eggs) # ERROR! UnboundLocalError: local variable 'eggs' referenced before assignment
发生这个错误是因为,Python看到spam()函数中有针对eggs的赋值语句❶,因此认为eggs变量是局部变量。但是因为print(eggs)的执行在eggs赋值之前,局部变量eggs并不存在。Python不会退回到使用全局eggs变量❷。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论