python - python中的导入行为
问题描述
假设 python 模块计算一次是否安全?如果在同一个程序和不同线程的不同文件中多次module A
包含并导入,会不会只计算/执行一次?CONST_A = json.load(...)
如果没有,什么时候CONST_A
重新计算?下一个结构会修复它吗?
module CALCULATE_CONST_A
import json
CONST_A = json.load(open(...))
module A
from CALCULATE_CONST_A import CONST_A
further imports of A...
最后一个问题:创建预计算常量的最佳实践是什么?
解决方案
好吧,让我们进行实验:
tbi.py
print("Hello, World!")
文件1.py
import tbi
print("This is file1")
文件2.py
import file1
import tbi
print("This is file2")
现在,当我们运行时file2
,我们看到:
$ python file2.py
Hello, World!
This is file1
This is file2
所以你的问题的答案是肯定的,python 模块只执行一次。如果tbi.py
执行两次,我们会看到"Hello World"
打印两次。因此,可以得出这样的结论:文件的属性是在第一次导入该文件时设置的。
此外,更多的实验可以告诉你,如果我将一个全局变量放入tbi
,file1
并file2
修改它,它们都将修改同一个对象。这在许多内置包中是可见的:例如,更改sys.stdout
(标准输出的文件描述符和sys
模块首次加载时指定的全局变量)的值会更改整个程序,而不仅仅是文件修改它。
如果你担心这种事情会导致错误,最好的办法是不要使用全局变量——相反,使用类并在构造时为它们分配默认值。
推荐阅读
- javascript - 关闭响应式菜单“点击”JavaScript
- c++ - 虚拟地整理碎片内存,就好像它在 C++ 中是连续的一样
- jestjs - 如何测试使用 apollo 客户端 Reactive Var 的组件
- django - 本地建设成功 | CodeBuild AWS 的成功与失败 | 构建日志显示应用程序启动并运行 | 状态永远在进行中
- bash - 将查找文件中的信息写入另一个文件
- javascript - Angular - 图像之间的交叉淡入淡出
- java - 当位移 16 位时,为什么输出因类型转换不同而不同
- jquery - 在进行 ajax 调用时更新按钮文本
- loops - java.lang.IndexOutOfBoundsException?
- python - 如何为 POS 打印机格式化 python 文本