在写程序中遇到这样一个问题,有一个base.py
文件,文件内容如下:
#base.py文件
global x
x='base'
def print_x():
print(x)
在另一个主程序test.py
中,导入这个文件,并使用其中的print_x
函数,但是我想修改base.py
中全局变量x
的值,于是在test.py
中的代码写成:
#test.py文件
from base import *
global x
x='test'
print_x()
#输出仍然为'base'
运行test.py
之后,发现输出仍然是'base'
,这是因为在 Python 中,全局变量是相对于模块(文件)的,而不是相对于代码中的位置。当在 test.py
中使用 global x
来定义 x
并赋值为 'test'
时,这个 x
是属于 test.py
模块的全局变量,而不是 base.py
中的全局变量 x
。
导入 base.py
文件中的内容后,在 test.py
中对 x
进行赋值操作,实际上是创建了一个新的 test.py
模块级别的 x
,而不是修改 base.py
中的 x
。这就是为什么 print_x()
函数仍然输出 'base'
。
网上给出的解决方法是:
#test.py文件
import base
base.x = 'test' # 修改 base.py 中的全局变量 x 的值
base.print_x() # 输出 'test'
但我不想每次用base里的函数的时候都要加上base.,因为实际情况中我的base.py中有很多函数需要在test.py中使用,于是这里给出另一种解决办法,在base.py中加入一个修改自身全局变量的函数,而后在test.py中调用它,修改后的两个文件如下:
#base.py文件
global x
x='base'
def print_x():
print(x)
def set_global_dct(v_name,v_value):#用于修改全局变量的值
glb_dct = globals()
glb_dct[v_name] = v_value
#test.py文件
from base import *
set_global_dct('x','test')
print_x()
这里使用globals()获得globals()所在文件的全局变量的字典,并进行修改。在test.py中调用base.py中的修改函数,传入要修改的变量名和新的值,这样在test.py中修改的就是base.py中的全局变量的值了。