python实现对导入包中的全局变量进行修改

发布时间:2024年01月10日

问题

在写程序中遇到这样一个问题,有一个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'

解决方案1

网上给出的解决方法是:

#test.py文件
import base

base.x = 'test'  # 修改 base.py 中的全局变量 x 的值
base.print_x()   # 输出 'test'

解决方案2

但我不想每次用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中的全局变量的值了。

文章来源:https://blog.csdn.net/qq_45270849/article/details/135514634
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。