Python跨模块全局变量赋值访问问题:赋值后取值为空
问题解决:修改utils模块全局变量后无法读取的问题
你遇到的核心问题是导入变量的方式导致赋值操作没有修改到原始全局变量:
当使用from utils import cod_user, name_user时,你导入的是变量的副本,而非对原始变量的引用。在A类的assign_values方法里直接写cod_user = cod,只是创建了方法内部的局部变量,完全没改动utils模块里的原始全局变量。所以B类读取的还是最初导入的空值副本。
解决方案一:直接导入utils模块(推荐)
通过模块名访问变量,明确操作的是utils模块里的全局变量,避免作用域混淆:
# main.py import utils class A(): def __init__(self) -> None: self.assign_values(1, 'User test') def assign_values(self, cod, name): # 直接修改utils模块的全局变量 utils.cod_user = cod utils.name_user = name print(utils.cod_user, utils.name_user) class B(): def __init__(self) -> None: self.get_values() def get_values(self): # 读取utils模块的全局变量 cod = utils.cod_user name = utils.name_user print(cod, name) if __name__ == '__main__': ca = A() cb = B()
解决方案二:使用global声明(不推荐)
如果一定要用from ... import的方式,需要在方法内用global声明变量,告诉Python你要修改的是全局作用域的导入变量:
# main.py from utils import cod_user, name_user class A(): def __init__(self) -> None: self.assign_values(1, 'User test') def assign_values(self, cod, name): global cod_user, name_user cod_user = cod name_user = name print(cod_user, name_user) class B(): def __init__(self) -> None: self.get_values() def get_values(self): cod = cod_user name = name_user print(cod, name) if __name__ == '__main__': ca = A() cb = B()
注意事项
优先选择第一种方案,通过模块名访问变量的方式更清晰,能直观看到变量所属的模块,减少因作用域混淆导致的bug。
内容的提问来源于stack exchange,提问作者Valdeir Frizzera
相关产品推荐
相关产品推荐

