Python中如何在函数里使用全局变量

Python中如何在函数里使用全局变量

技术背景

在Python编程中,变量的作用域决定了其可见性和生命周期。全局变量定义在模块级别,可被模块内的所有函数访问。然而,在函数内部使用全局变量时,需要遵循一定规则,否则可能会引发UnboundLocalError等问题。理解如何正确使用全局变量,对于编写复杂的Python程序至关重要。

实现步骤

1. 在函数内使用全局变量的值

如果仅在函数内部读取全局变量的值,无需使用global关键字。示例代码如下:

1
2
3
4
5
6
globvar = 0

def print_globvar():
print(globvar)

print_globvar() # 输出: 0

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) # 输出: 1

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()) # 输出: Foo!!!
change_global_variable()
print(use_global_variable()) # 输出: Bar!!!

4. 跨模块共享全局变量

创建一个专门的配置模块,在其他模块中导入该配置模块来共享全局变量。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
# config.py
x = 0

# mod.py
import config
config.x = 1

# main.py
import config
import mod
print(config.x) # 输出: 1

核心代码

基本使用示例

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) # 输出: 22

可变对象示例

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) # 输出: [123.4 3. ]

最佳实践

  • 避免滥用全局变量:全局变量会增加代码的耦合度,使代码难以理解和维护。尽量使用函数参数和返回值来传递数据。
  • 使用配置模块:对于需要在多个模块间共享的全局变量,可创建专门的配置模块,提高代码的可维护性。
  • 明确变量作用域:在函数内部使用全局变量时,使用global关键字明确声明,避免出现意外的局部变量覆盖全局变量的情况。

常见问题

1. UnboundLocalError错误

当在函数内部对一个变量进行赋值操作,且未使用global关键字声明时,Python会将该变量视为局部变量。若在赋值前尝试读取该变量,就会引发UnboundLocalError。示例代码如下:

1
2
3
4
5
6
7
globvar = 0

def wrong_function():
print(globvar) # 此处会引发UnboundLocalError
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来创建共享变量。


Python中如何在函数里使用全局变量
https://119291.xyz/posts/2025-04-21.python-how-to-use-global-variables-in-functions/
作者
ww
发布于
2025年4月22日
许可协议