我是python的新手,我只是在测试使用from module_name import function
从一个模块到另一个模块的导入功能。但是,当我导入函数时,它也会导入并执行for循环,该循环不是函数的一部分,而是模块的一部分。
模块1:
from Fibonacci import fibonacci
fibonacci(10)
模块2:
def fibonacci(Number):
for i in range(1,Number+1):
if i == 1:
sumCount = 0
First = 0
elif i ==2:
Second = 1
sumCount = 1
else:
sumCount = First + Second
First = Second
Second = sumCount
print(sumCount)
for F in range(1,10):
fibonacci(F)
当我导入函数fibonacci时,将执行for循环。为什么会这样,我该如何阻止呢?
答案 0 :(得分:2)
“为什么”执行时并没有真正的误解,python就是这种方式。
docs说:
发件人表单使用的过程稍微复杂一些:
- 找到from子句中指定的模块,必要时加载并初始化它;
- 对于导入子句中指定的每个标识符:
- 检查导入的模块是否具有该名称的属性
- 如果不是,请尝试导入具有该名称的子模块,然后再次检查导入的模块中的该属性
- 如果找不到该属性,则会引发ImportError。
- 否则,对该值的引用存储在本地名称空间中,使用as子句中的名称(如果存在),否则使用属性名称
还有(这里是reference):
一个模块可以包含可执行语句以及函数定义。 这些语句旨在初始化模块。仅在import语句中第一次遇到模块名称时才执行它们。(如果文件作为脚本执行,它们也将运行。)
这回答了问题“为什么”。即使您从模块中加载单个函数,该模块仍会初始化(以这种方式运行是有意义的)。因此,将执行任何“免费”代码。
这意味着除非将“ free”语句用于初始化模块,否则不要将它们放入模块中。
为防止这种行为,请像其他答案一样使用if __name__ == "main":
语句。在if
中放入仅在直接调用模块时应执行的所有代码(例如,用于测试的代码)。
答案 1 :(得分:0)
在模块2中,将for循环放入检查是否主要。
def fibonacci(Number):
for i in range(1,Number):
...
return N
if __name__ == '__main__':
for F in range(1,10):
fibonacci(F)
请参见Here找出原因