Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么从模块导入函数会导入整个模块?_Python - Fatal编程技术网

Python 为什么从模块导入函数会导入整个模块?

Python 为什么从模块导入函数会导入整个模块?,python,Python,我是python新手,我正在测试使用from module\u 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

我是python新手,我正在测试使用
from module\u 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中,将for循环放在检查是否为main的内部

def fibonacci(Number):
    for i in range(1,Number):
        ...
    return N

if __name__ == '__main__':
    for F in range(1,10):
        fibonacci(F)

请参阅以了解为什么执行它的“为什么”并没有真正的疑问,python就是这样工作的

他们说:

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

  • 查找from子句中指定的模块,加载并在必要时初始化它
  • 对于导入条款中指定的每个标识符:
  • 检查导入的模块是否具有该名称的属性
  • 如果没有,请尝试导入具有该名称的子模块,然后再次检查导入的模块是否具有该属性
  • 如果未找到该属性,则引发ImportError
  • 否则,对该值的引用将存储在本地命名空间中,如果存在,则使用as子句中的名称,否则使用属性名称
  • 还有(这里是:

    模块可以包含可执行语句以及函数定义这些语句用于初始化模块。只有在导入语句中第一次遇到模块名时,才会执行这些命令。(如果文件作为脚本执行,也会运行这些命令。)

    这就回答了“为什么”的问题。即使从模块中加载单个函数,模块仍会初始化(这样做很有意义)。因此执行任何“自由”代码

    这意味着您不应该在模块中放入“free”语句,除非它们是用来初始化模块的。

    为了防止这种行为,请像其他答案所说的那样,使用
    if\uuu name\uuu==“main”:
    语句。如果只有在直接调用模块时才应执行的所有代码(例如,用于测试目的的代码)。

    是否确定不属于
    def
    的循环正在执行?是的,输出为:0 1 1 2 3 5 8 13 21如果uu name uu==“main”,则可以使用
    @youssef这是可行的,但是为什么要通过函数来完成呢?
    import
    s在AST级别不起作用,而是对整个模块进行求值,然后拉出其命名空间中的对象。这种设计有很多优点——模块定义可以包含修改对象的代码,因为整个模块一次运行,除了第一个
    import
    外,其他所有模块都非常快,因为生成的对象可以缓存。这并不能回答问题,这是一个解决方案,但是他问如果他只导入了这个函数,为什么这个函数就可以运行。嗨,谢谢你,但是为什么它要与这个函数一起导入呢?嘿,看这篇之前的stackoverflow帖子,@kudeh谢谢,这个链接非常有用