Python运行时如何重新导入变量?模块间变量同步问题求解
解决Python模块变量导入后无法同步更新的问题
咱先理清楚问题根源:你用from module_1 import *导入A的时候,其实是把module_1里A的当前值(5)复制了一份到module_2的命名空间里。后来调用change_A()修改的是module_1模块本身里的A,但x实例的y属性已经存了一开始复制的那个5,自然不会跟着变。
下面给你几个可行的解决方案,按需选就行:
方案1:直接导入整个模块,通过模块访问变量(最推荐)
这种方式最符合Python的模块设计逻辑,每次访问变量都是直接从原模块拿最新值。
先修正module_2的代码(注意你原来的__init__少了self参数,会导致实例化报错,先补上):
import module_1 class x(): def __init__(self): pass @property def y(self): # 每次访问y的时候,都去module_1里取最新的A值 return module_1.A
测试代码:
m = x() print(m.y) # 输出5 module_1.change_A() print(m.y) # 输出10
这样不管什么时候修改module_1.A,访问m.y都会拿到最新的值。
方案2:用可变类型包装不可变变量
Python里像int这种不可变类型,赋值的时候是传值不是传引用。那我们可以用可变类型(比如列表、字典或者自定义类)把A包起来,这样保存的就是引用,修改内部值时所有引用都会同步。
修改module_1:
# 用列表包装A,这样它变成了可变对象 A = [5] B = 6 def change_A(): global A # 修改列表里的元素,而不是重新赋值A A[0] = 10
module_2的代码可以不用大改,只需要调整访问方式:
from module_1 import * class x(): def __init__(self): # 这里拿到的是列表的引用,不是具体的值 self.y = A
测试代码:
m = x() print(m.y[0]) # 输出5 change_A() print(m.y[0]) # 输出10
这种方式适合不想改模块导入方式的场景,但需要注意访问时要取列表的第一个元素,稍微有点麻烦。
方案3:动态获取变量值
如果不需要把y作为实例属性保存,而是每次用的时候再去拿最新值,可以给x类加个方法:
from module_1 import * class x(): def get_y(self): # 每次调用这个方法,都去拿最新的A值 return A
测试代码:
m = x() print(m.get_y()) # 输出5 change_A() print(m.get_y()) # 输出10
要是觉得调用方法麻烦,同样可以用@property把它变成属性,和方案1类似。
内容的提问来源于stack exchange,提问作者alwbtc
相关产品推荐
相关产品推荐

