Python中如何在函数里使用全局变量
技术背景
在Python编程中,变量的作用域决定了其可见性和生命周期。全局变量定义在模块级别,可被模块内的所有函数访问。然而,在函数内部使用全局变量时,需要遵循一定规则,否则可能会引发UnboundLocalError
等问题。理解如何正确使用全局变量,对于编写复杂的Python程序至关重要。
实现步骤
1. 在函数内使用全局变量的值
如果仅在函数内部读取全局变量的值,无需使用global
关键字。示例代码如下:
1 2 3 4 5 6
| globvar = 0
def print_globvar(): print(globvar)
print_globvar()
|
2. 在函数内修改全局变量的值
若要在函数内部修改全局变量的值,必须使用global
关键字声明。示例代码如下:
1 2 3 4 5 6 7 8
| globvar = 0
def set_globvar_to_one(): global globvar globvar = 1
set_globvar_to_one() print(globvar)
|
3. 在多个函数间共享全局变量
先在函数中使用global
关键字声明并初始化全局变量,其他函数也使用global
关键字来访问和修改该变量。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def create_global_variable(): global global_variable global_variable = 'Foo'
def use_global_variable(): return global_variable + '!!!'
def change_global_variable(): global global_variable global_variable = 'Bar'
create_global_variable() print(use_global_variable()) change_global_variable() print(use_global_variable())
|
4. 跨模块共享全局变量
创建一个专门的配置模块,在其他模块中导入该配置模块来共享全局变量。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11
| x = 0
import config config.x = 1
import config import mod print(config.x)
|
核心代码
基本使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| global_var = 10
def func_1(): global global_var global_var += 1
def func_2(): global global_var global_var *= 2 print(f"func_2: {global_var}")
func_1() func_2() print("Global scope:", global_var)
|
可变对象示例
1 2 3 4 5 6 7 8 9
| import numpy as np
hostArray = np.array([2., 3.])
def func4(): hostArray[0] = 123.4
func4() print("After func4(), hostArray = ", hostArray)
|
最佳实践
- 避免滥用全局变量:全局变量会增加代码的耦合度,使代码难以理解和维护。尽量使用函数参数和返回值来传递数据。
- 使用配置模块:对于需要在多个模块间共享的全局变量,可创建专门的配置模块,提高代码的可维护性。
- 明确变量作用域:在函数内部使用全局变量时,使用
global
关键字明确声明,避免出现意外的局部变量覆盖全局变量的情况。
常见问题
1. UnboundLocalError
错误
当在函数内部对一个变量进行赋值操作,且未使用global
关键字声明时,Python会将该变量视为局部变量。若在赋值前尝试读取该变量,就会引发UnboundLocalError
。示例代码如下:
1 2 3 4 5 6 7
| globvar = 0
def wrong_function(): print(globvar) globvar = 1
wrong_function()
|
解决方法是在函数内部使用global
关键字声明该变量:
1 2 3 4 5 6 7 8
| globvar = 0
def correct_function(): global globvar print(globvar) globvar = 1
correct_function()
|
2. 多进程中全局变量问题
在多进程编程中,每个进程都有自己独立的内存空间,全局变量在不同进程中是相互独立的。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| import multiprocessing
counter = 0
def do(task_id): global counter counter += 1 print(f'task {task_id}: counter = {counter}')
if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) task_ids = list(range(4)) pool.map(do, task_ids)
|
在不同操作系统上,上述代码的输出可能不同。在Windows和macOS上,每个进程会独立修改自己的counter
变量;而在Linux上,由于使用fork()
机制,情况可能不同。解决方法是使用multiprocessing.Manager
来创建共享变量。