Python跨文件动态赋值变量失效问题求助
file1.py 代码:
var1 = 1 var2 = 2
file2.py 代码:
import file1 class File2: def assign2(self, varName, val): # ... 执行操作 ... setattr(file1, varName, val) print(str(getattr(file1, varName))) # 输出 3, 4 def assign1(self): self.assign2("var1", 3) self.assign2("var2", 4) print(str(getattr(file1, "var1"))) # 输出 1 print(str(getattr(file1, "var2"))) # 输出 2
遇到的问题:直接在 file2.py 中执行 file1.var1 = 3 能成功更新变量,但用 setattr 动态赋值后,assign1 中打印变量又变回初始值,仅 assign2 内打印结果正确。
setattr(file1, varName, val) 和直接赋值 file1.varName = val 功能完全等价,问题不可能出在 setattr 本身。结合现象来看,大概率是以下原因:
assign2中的「执行操作」重置了变量
检查assign2中setattr前后的代码,是否存在重新加载file1模块(比如importlib.reload(file1))、重新给var1/var2赋值的逻辑,这些操作会覆盖setattr的修改。模块对象不一致
确认file2中导入的file1是同一个模块对象:在assign2和assign1中分别打印id(file1),如果输出不同,说明存在多个file1模块实例(比如不同路径下的同名文件、重复导入且模块被修改过)。这种情况需要清理项目路径,确保只有一个file1.py,且导入方式统一。其他代码干扰
检查是否有其他线程、其他函数在assign2执行完毕后到assign1打印前,修改了file1的变量。
在 file2.py 中添加模块对象ID打印,确认一致性:
import file1 class File2: def assign2(self, varName, val): # ... 执行操作 ... print(f"assign2中file1的ID: {id(file1)}") setattr(file1, varName, val) print(str(getattr(file1, varName))) def assign1(self): print(f"assign1中file1的ID: {id(file1)}") self.assign2("var1", 3) self.assign2("var2", 4) print(str(getattr(file1, "var1"))) print(str(getattr(file1, "var2")))
如果两次ID一致,说明模块对象是同一个,问题肯定出在 assign2 的「执行操作」代码里;如果ID不一致,排查导入路径问题。
内容的提问来源于stack exchange,提问作者Andrew

