此时更改文件会改变执行结果吗?

时间:2018-01-04 12:01:04

标签: python

假设我有一个模块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被懒惰地调用(例如在函数上以避免循环依赖),将运行来自不同分支的代码。这是真的吗?

2 个答案:

答案 0 :(得分:1)

来自documentation

  

模块可以包含可执行语句以及函数定义。这些语句用于初始化模块。它们仅在导入语句中遇到模块名称的第一个时间执行。

因此,一旦模块被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 documentation

  

首次导入模块时,Python会搜索模块以及是否   发现,它创建了一个模块对象1,初始化它。

创建此对象后,即使在另一个模块中重新导入它,它也会被使用,python会跟踪已导入的模块。 如果你想重新加载它们,你必须手动完成,检查python2的内置reload或python3的imp.reload