我对Python的某些行为感到困惑。我一直认为导入模块基本上意味着执行它。 (就像他们在这里说的那样:Does python execute imports on importation)所以我创建了三个简单的脚本来测试一些东西:
main.py
import config
print(config.a)
config.a += 1
print(config.a)
import test
print(config.a)
config.py
def get_a():
print("get_a is called")
return 1
a = get_a()
test.py
import config
print(config.a)
config.a += 1
运行main.py时的输出是:
get_a is called
1
2
2
3
现在我很困惑因为我希望get_a()
被调用两次,一次来自main.py
,一次来自test.py
。有人可以解释为什么不是吗?如果我真的想第二次导入配置怎么办,就像它在a=1
开头一样?
(幸运的是,对于我的项目,这种行为正是我想要的,因为get_a()
对应于一个函数,它从数据库中读取大量数据,当然我只想读一次,但它应该可以从多个模块访问。)
答案 0 :(得分:1)
因为配置模块已经加载所以不再需要“运行”它,只需返回加载的实例。
一些标准库模块使用此示例,例如random。它在第一次导入时创建一个Random类对象,并在再次导入时重用它。对该模块的评论如下:
# Create one instance, seeded from current time, and export its methods
# as module-level functions. The functions share state across all uses
#(both in the user's code and in the Python libraries), but that's fine
# for most programs and is easier for the casual user than making them
# instantiate their own Random() instance.