在python编程中,一般使用global 关键字来定义全局变量,但是发现 global 关键字在涉及多个文件时,好像存在问题。
比如,单个文件下用global定义使用全局变量的情况 ,看下面的代码
# -*-coding: utf-8 -*- #from data_def import * distance=34 class test(object): def __init__(self): pass #在类里面改变全局变量的值 def change_1(self): global distance distance=90 print("distance in class:", distance) #输出全局变量的值 def print_value(self): global distance print("distance in class:", distance) #在函数里面使用和打印全局变量的值 def function_test(): global distance print("global value in function", distance) distance=234 print("global value in function",distance) function_test() #在函数里面使用和改变全局变量的值 34->234 t=test() t.print_value() #在类里面打印全局变量的值 234 t.change_1() #在类里面改变全局变量的值 234->90
程序运行结果如下:全局变量运行正确
global value in function 34 global value in function 234 distance in class: 234 distance in class: 90
下面把上述代码拆分成两个文件,data_def.py 和 main.py ,data_def.py 定义全局变量distance 和类 ,main.py 导入data_def.py。
data_def.py文件代码如下:
# -*-coding: utf-8 -*- distance=34 class test(object): def __init__(self): pass #在类里面改变全局变量的值 def change_1(self): global distance distance=90 print("distance in class:", distance) #输出全局变量的值 def print_value(self): global distance print("distance in class:", distance)
main.py文件代码如下:
# -*-coding: utf-8 -*- from data_def import * #在函数里面使用和打印全局变量的值 def function_test(): global distance print("global value in function", distance) distance=234 print("global value in function",distance) print("gloabl value in main:",distance) #主函数里面,全局变量为34 function_test() #在函数里面使用和改变全局变量的值 34->234 t=test() t.print_value() #在类里面打印全局变量的值 输出为 34 并非是234,函数里面改变全局变量值不影响类里面全局变量的值??? t.change_1() #在类里面改变全局变量的值 34->90
程序运行结果:
gloabl value in main: 34 global value in function 34 global value in function 234 distance in class: 34 distance in class: 90
两次运行的结果存在出入,可以发现,用global 在不同文件间操作全局变量时,生成的结果和我们想象的不太一样,具体原因还不明确??知道原因的欢迎留言。
为此,可以考虑用类变量来定义全局变量。实现方式看以下代码。
第一个文件(data_def.py)定义两个类,第一个类定义全局变量distance ,第二个类为普通操作类
# -*-coding: utf-8 -*- #filename:data_def.py #构造类变量作为全局变量,代替global class global_value(): distance=34 class test(object): def __init__(self): pass #在类里面改变全局变量的值 def change_1(self): global_value.distance=40 print("distance in class:", global_value.distance) def change_2(self): global_value.tail_dis=90 print("distance in class:",global_value.distance) #输出全局变量的值 def print_value(self): print("distance in class:", global_value.distance)
第二个文件(main.py) 导入第一个文件定义的类,并进行变量操作
# -*-coding: utf-8 -*- from data_def import * #在函数里面使用和打印全局变量的值 def function_test(): print("global value in function", global_value.distance) global_value.distance=234 print("global value in function",global_value.distance) print("global value in main:",global_value.distance) #打印出全局变量的初始值:34 t=test() t.change_1() #在类里面改变全局变量的值:34->40 print("global value in main:",global_value.distance) t.change_2() #在类里面改变全局变量的值:40->90 print("global value in main:",global_value.distance) function_test() #在自定义函数里面使用和改变全局变量的值 90->234 global_value.distance=11 #在main主函数里面改变全局变量的值 234->11 t.print_value() #在类里面查看已经改变的全局变量的值 11
程序输出结果如下:
程序执行输出结果: global value in main: 34 distance in class: 40 global value in main: 40 distance in class: 40 global value in main: 40 global value in function 40 global value in function 234 distance in class: 11
从输出结果可以看出,利用类变量的方式也可以实现全局变量的定义,并且可以跨文件操作。