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

瑞安

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

华伦天奴

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

文件说:

from表单使用的过程稍微复杂一些:

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

并且(这里是参考资料):

一个模块可以包含可执行语句以及函数定义。这些语句旨在初始化模块。仅在import语句中第一次遇到模块名称时才执行它们。(如果文件作为脚本执行,它们也会运行。)

这回答了问题“为什么”。即使您从模块中加载单个函数,该模块仍将初始化(以这种方式运行是有意义的)。因此,将执行任何“免费”代码。

这意味着除非将“ free”语句用于初始化模块,否则不应将它们放入模块中。
为防止此行为,请使用if __name__ == "main":其他答案所述语句。if所有仅在直接调用模块时应执行的代码放入其中(例如,用于测试的代码)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么导入模块会导致循环导入错误

尝试导入与内置模块同名的模块会导致导入错误

从Python模块导入多个功能

在使用绝对导入时,为什么PyCharm会抱怨缺少的模块?

为什么导入节点模块会破坏我的内部Typescript名称空间在atom-typescript中?

Python / Django:为什么在使用模块之前立即导入模块会阻止循环导入?

为什么在“导入模块”和“从模块导入*”中,全局变量的行为不同?

当未定义默认导出时,“模块”中的导入模块会导入什么?为什么它与作为模块导入*不同?

Powershell不从模块导入功能

从导入的模块覆盖导入模块的内置功能

为什么导入模块会破坏我的doctest(Python 2.7)

为什么Jest会尝试运行整个应用程序而不是导入的模块?

为什么必须导出我在angular appModule导入模块中使用的功能?

Python导入模块功能

为什么已经导入模块时需要显式导入模块?

导入模块/功能的方式是什么?

为什么子模块的代码尝试直接或通过相对导入来导入同级子模块?

为什么共享模块导入失败?

定义功能后导入模块

导入动态加载模块的功能

Javascript模块导入失败-为什么?

为什么我不能导入模块?

为什么要从删除的路径导入模块?

包含主模块功能的导入模块

Python:从已导入的模块导入功能

从腌制文件读取时,为什么熊猫会尝试导入模块?

无法使用 PyCharm 导入模块,为什么?

导入整个模块或导入某个函数有什么区别?

为什么有些 Angular 模块会导入而有些却不会?