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

10 浏览
0 Comments

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

我刚开始学习Python,正在尝试从一个模块中导入一个函数到另一个模块中使用from module_name import function。然而,当我导入这个函数时,它也导入并执行了一个不属于该函数但属于该模块的for循环。\n模块1:\n

from Fibonacci import fibonacci
    fibonacci(10)

\n模块2:\n

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)

\n当我导入fibonacci函数时,for循环被执行。为什么会这样,我该如何停止这个?

0
0 Comments

问题:为什么从一个模块中导入一个函数会导入整个模块?

出现的原因:当从一个模块中导入一个函数时,Python会执行整个模块的代码。这是因为在导入模块时,Python需要将模块的所有内容加载到内存中,以便在导入的函数中使用。

解决方法:可以使用以下两种方法解决这个问题。

方法一:将需要执行的代码放在if __name__ == '__main__':条件判断语句中。这样,只有当直接运行这个模块时,if语句中的代码才会被执行,而当从其他模块中导入这个模块时,if语句中的代码不会被执行。

def fibonacci(Number):
    for i in range(1,Number):
        ...
    return N
if __name__ == '__main__':
    for F in range(1,10):
        fibonacci(F)

方法二:在导入模块时,只导入需要使用的函数,而不是导入整个模块。可以使用以下语法导入单个函数:

from module_name import function_name

这样,只有需要使用的函数会被导入,而不会导入整个模块。

希望以上内容对您有所帮助。如有更多疑问,可以参考之前的stackoverflow帖子或咨询其他相关资源。

0
0 Comments

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

在Python中,当从一个模块中导入一个函数时,整个模块会被导入和初始化。这是Python的工作方式,这也是为什么会出现这个问题的原因。

根据Python的文档,从一个模块中导入函数的过程如下:

1. 找到指定的模块,并在需要时加载和初始化它;

2. 对于导入语句中指定的每个标识符:

- 检查导入的模块是否具有该名称的属性;

- 如果没有,尝试导入具有该名称的子模块,然后再次检查导入的模块是否具有该属性;

- 如果找不到该属性,将引发ImportError;

- 否则,将该值的引用存储在本地命名空间中,如果存在as子句,则使用as子句中的名称,否则使用属性名称。

另外,Python的文档还指出:

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

这就解答了为什么会出现这个问题。即使你只从模块中加载一个函数,模块仍然会被初始化(这样做是有道理的)。因此,任何“自由”代码都会被执行。

这意味着,除非“自由”语句是用来初始化模块的,否则不应该将它们放在一个模块中。

为了防止这种行为,可以使用if __name__ == "main":语句,这是其他答案中提到的解决方法。将所有只在模块直接调用时需要执行的代码放在这个if语句中(例如用于测试的代码)。

0