You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:45:57