if __name__ == "__main__" 的作用是什么?

4

我正在学习main函数,并通过代码来探索它的应用:

a = 1
b = 2

def main():
    x = add(a, b)
    print(x)

if __name__ == "__main__":
    main()

def add(a, b):
    a = a + 1
    return a + b

然而,它报告了 NameError 错误:
In [87]: run test.py                                                                                              
---------------------------------------------------------------------------
NameError   Traceback (most recent call last)

NameError: name 'add' is not defined

if __name__ == "__main__": 重新放置到文件结尾是一种解决方案。
a = 1
b = 2

def main():
    x = add(a, b)
    print(x)

def add(a, b):
    a = a + 1
    return a + b

if __name__ == "__main__":
    main()
In [88]: run test.py                                                                                              
4

我对之前的案例失败感到困惑。
如果__name__ == "__main__",则调用main函数,main函数调用add函数。

1
https://www.youtube.com/watch?v=sugvnHA7ElY - user5319825
2个回答

7

Python中所有的操作都是按顺序执行的,从上到下。

a = 1  # assigns 1 -> a
b = 2  # assigns 2 -> b

def main():  # main is defined
    # body of main, not executed until it's called.

if __name__ == "__main__":  # it does! Let's enter the block
    main()  # let's run main, so we have to look back at that block we skipped earlier...

    # from above
    x = add(a, b)  # call add....oh wait -- WHAT'S add?!

在下面的示例中,add在执行main之前已经被定义,因此当你调用x = add(a, b)时,main知道该怎么做。

如果有一行正在执行的代码,那么它后面的代码会被忽略吗? - AbstProcDo
执行的代码从上到下运行。当它遇到调用main的代码行时,它会执行main函数体中的代码。该代码调用add函数,但在您的顶部示例中,执行的代码尚未到达add函数的定义(因为它在调用main之后),因此main无法知道add是什么。 - Adam Smith
谢谢,我明白了。在定义之前调用add(a,b)。 - AbstProcDo

5

Python会在从文件中读取代码行的同时有效地运行它们。(实际上并非如此,但是为了这个问题的目的,它表现得像这样。)因此,当运行以下代码片段时:

if __name__ == "__main__":
    main()

在你的第一个代码示例中,add函数尚未定义。这只会在Python遇到def add(...):块时发生。由于main()调用了add(),因此Python会抱怨正在使用未定义的名称(add)。
当您将def add(...):块移动到调用main()之前时,add()的定义发生在main()运行之前,所以一切都顺利。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接