假设我有一个模块foo.py
,包含一些代码,以及一个包含main.py
的脚本foo
,并使用python -m main
执行。
此时更改foo
的代码会影响python -m main
的结果?
具体来说,调用import
“冻结”文件是否意味着未来的执行不受更改影响?
main.py
的示例:
input()
import foo
input()
import foo
print(foo.f())
在哪些情况下修改模块文件会影响执行的结果?
我的问题与以下内容有关:
如果我在版本控制下有一个代码并运行它,并签出一个不同的分支,那么如果一些import
被懒惰地调用(例如在函数上以避免循环依赖),将运行来自不同分支的代码。这是真的吗?
答案 0 :(得分:1)
模块可以包含可执行语句以及函数定义。这些语句用于初始化模块。它们仅在导入语句中遇到模块名称的第一个时间执行。
因此,一旦模块被import
编辑一次,更改磁盘上的模块就不会有任何影响。您可以自己看到:有一个文件foo.py
在导入时打印“foo”:
print("foo")
和多次导入main.py
的文件foo
:
import foo
import foo
import foo
您可以看到,当您运行main.py
时,输出只有一个foo
,因此foo.py
只运行一次。
(请注意,有一个函数importlib.reload
尝试重新加载模块,但不能保证替换对旧模块的所有引用。)
关于你的编辑,是的,这是正确的。
答案 1 :(得分:0)
首次导入模块时,Python会搜索模块以及是否 发现,它创建了一个模块对象1,初始化它。
创建此对象后,即使在另一个模块中重新导入它,它也会被使用,python会跟踪已导入的模块。
如果你想重新加载它们,你必须手动完成,检查python2的内置reload
或python3的imp.reload