简要介绍如何在Python中利用global关键字定义的全局变量在不同模块间共享,避免后续重复犯错。

背景

它们位于同一个模块下:

1
2
$ ls
__pycache__/  app1.py  main.py

各自内容分别如下

app1.py有一个 global修饰的全局变量,通过set_variables方法对其值进行修改

1
2
3
4
5
6
MESSAGE = None


def set_variables():
    global MESSAGE
    MESSAGE = "Hello Python"

main.py主程序,调用上述方法并打印出MESSAGE的值

1
2
3
4
5
from app1 import set_variables

if __name__ == '__main__':
    set_variables()
    # print(MESSAGE)

不生效用法

一开始自己想复用import xxx from xxx 这种用法,将main.py修改为如下

1
2
3
4
5
from app1 import set_variables, MESSAGE

if __name__ == '__main__':
    set_variables()
    print(MESSAGE)

结果输出值为None,没有达到预期的结果。

正确用法

直接用import xxx实现

1
2
3
4
5
import app1

if __name__ == '__main__':
    app1.set_variables()
    print(app1.MESSAGE)

或用import xxx as xxx给其加上一个别名

1
2
3
4
5
import app1 as a

if __name__ == '__main__':
    a.set_variables()
    print(a.MESSAGE)

原因分析

参见Global variable not changing between files in python中的大佬回答如下:

The syntax from globals.py import * makes copies of the variables within globals.py into your local file. To access the variables themselves without making copies, import globals and use the variable directly: globals.filename. You no longer need the global keyword if you access the variable this way.