Python中的全局变量/共享数据

使用类属性

可以在模块间共享数据

global_vars.py:

1
2
class GlobalVars:
global_variable = "Hello, World!"

main.py:

1
2
3
4
5
6
7
8
9
from global_vars import GlobalVars

def main():
print(GlobalVars.global_variable) # 输出: Hello, World!
GlobalVars.global_variable = "New value"
print(GlobalVars.global_variable) # 输出: New value

if __name__ == "__main__":
main()

使用 Singleton 模式

如果你需要确保某个类只有一个实例,并且提供一个全局点来访问它,可以使用 Singleton 模式。

可以在模块间共享数据

singleton.py:

1
2
3
4
5
6
7
8
class Singleton:
_instance = None

def __new__(cls):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls)
cls._instance.global_variable = "Hello, World!"
return cls._instance

main.py:

1
2
3
4
5
6
7
8
9
10
11
12
from singleton import Singleton

def main():
s1 = Singleton()
print(s1.global_variable) # 输出: Hello, World!
s1.global_variable = "New value"

s2 = Singleton()
print(s2.global_variable) # 输出: New value

if __name__ == "__main__":
main()

使用global关键字

注意

只能在模块内不同函数间共享

global 关键字用于声明一个变量是全局变量,但它只能在当前模块中生效。

也就是说,global 关键字的作用范围仅限于当前模块(Python 文件)。

在函数内部,如果你想修改全局变量,可以使用 global 关键字。

main.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
global_variable = "Hello, World!"

def modify_global():
global global_variable
global_variable = "New value"

def main():
print(global_variable) # 输出: Hello, World!
modify_global()
print(global_variable) # 输出: New value

if __name__ == "__main__":
main()

不定义也不会报错

1
2
3
4
5
6
7
8
def mfun():
global global_variable
global_variable = 10
print("mfun:", global_variable) # 10

if __name__ == "__main__":
mfun()
print("__main__:", global_variable) # 10

这样就必须在外层定义,否则未调用方法前会报错

1
2
3
4
5
6
7
8
9
10
global_variable=5
def mfun():
global global_variable
global_variable = 10
print("mfun:", global_variable) # 10

if __name__ == "__main__":
print("__main__:", global_variable) # 5
mfun()
print("__main__:", global_variable) # 10

if __name__ == "__main__"中定义的变量不用加global,也是全局变量

1
2
3
4
5
6
7
def modify_global_variable():
print("在 modify_global_variable 函数中修改后的变量:", global_variable) # 10

if __name__ == "__main__":
global_variable = 10
print("在 if 代码块中定义的变量:", global_variable) # 10
modify_global_variable()

但是修改的时候要加global

1
2
3
4
5
6
7
8
9
10
def modify_global_variable():
global global_variable
global_variable = 20
print("在 modify_global_variable 函数中修改后的变量:", global_variable) # 20

if __name__ == "__main__":
global_variable = 10
print("在 __main__ 代码块中定义的变量:", global_variable) # 10
modify_global_variable()
print("在 __main__ 代码块中查看修改后的变量:", global_variable) # 20

也就是说

  • 入口中定义的变量不用global声明也是全局变量。
  • 函数中修改全局变量必须再使用global声明。