为什么从模块导入功能会导入整个模块?

时间:2019-04-14 17:52:53

标签: python

我是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循环。为什么会这样,我该如何阻止呢?

2 个答案:

答案 0 :(得分:2)

“为什么”执行时并没有真正的误解,python就是这种方式。

docs说:

  

发件人表单使用的过程稍微复杂一些:

     
      
  1. 找到from子句中指定的模块,必要时加载并初始化它
  2.   
  3. 对于导入子句中指定的每个标识符:      
        
    1. 检查导入的模块是否具有该名称的属性
    2.   
    3. 如果不是,请尝试导入具有该名称的子模块,然后再次检查导入的模块中的该属性
    4.   
    5. 如果找不到该属性,则会引发ImportError。
    6.   
    7. 否则,对该值的引用存储在本地名称空间中,使用as子句中的名称(如果存在),否则使用属性名称
    8.   
  4.   

还有(这里是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找出原因