Python如何在函数中使用同名的全局变量?
我们知道,全局变量默认可以在所有函数内被访问,但是,如果当函数中定义了与全局变量同名的变量时,就会发生局部变量遮蔽(hide)全局变量的情形,例如如下程序:
Python 语法规定,在函数内部对不存在的变量赋值时,默认就是重新定义新的局部变量,这会使得函数内部遮蔽重名的 name 全局变量。由于局部变量 name 在 print(name) 后才初始化,所以程序会报错。
为了避免这个问题,可以通过以下 2 种方式来修改上面程序:
name = 'Charlie' def test (): # 直接访问name全局变量 print(name) # Charlie test() print(name)上面程序中,第 4 行直接访问 name 变量,这是允许的,此时程序将会输出 Charlie。如果在第 4 行代码之后(仍添加在函数内部)再增加如下一行代码:
name = '孙悟空'
再次运行该程序,将会看到如下错误:UnboundLocalError : local variable ‘name’ referenced before assignment
该错误提示所访问的 name 变量还未定义。这是什么原因呢?这正是由于程序在 test() 函数中增加了“name='孙悟空'”一行代码造成的。Python 语法规定,在函数内部对不存在的变量赋值时,默认就是重新定义新的局部变量,这会使得函数内部遮蔽重名的 name 全局变量。由于局部变量 name 在 print(name) 后才初始化,所以程序会报错。
为了避免这个问题,可以通过以下 2 种方式来修改上面程序:
-
访问被遮蔽的全局变量。如果希望程序依然能访问 name 全局变量,且在函数中可重新定义 name 局部变量,也就是在函数中可以访问被遮蔽的全局变量,此时可通过 globals() 函数来实现,将上面程序改为如下形式即可:
name = 'Charlie' def test (): # 直接访问name全局变量 print(globals()['name']) # Charlie name = '孙悟空' test() print(name) # Charlie
-
在函数中声明全局变量。为了避免在函数中对全局变量赋值(不是重新定义局部变量),可使用 global 语句来声明全局变量。因此,可将程序改为如下形式:
name = 'Charlie' def test (): # 声明name是全局变量,后面的赋值语句不会重新定义局部变量 global name # 直接访问name全局变量 print(name) # Charlie name = '孙悟空' test() print(name) # 孙悟空
增加了“global name”声明之后,程序会把 name 变量当成全局变量,这意味着 test() 函数后面对 name 赋值的语句只是对全局变量赋值,而不是重新定义局部变量。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频