Python中的if __name__ == "__main__"是什么意思?

在Python中,你会经常看到以下这行代码:

if __name__ == "__main__":
  print("Hello, World!")

虽然你可能以前见过这个代码,甚至使用过几次,但可能不清楚它的作用和工作原理。让我们考虑以下设置 - 两个脚本,script1.pyscript2.pyscript2.py导入script1.py并调用其中的一个函数。

```py [script1.py] def do_stuff: print('Doing stuff')

do_stuff()


```py [script2.py]
from script1 import do_stuff

do_stuff()

你认为当你运行这两个脚本时会发生什么?让我们看看。

$ python script1.py
# 输出:Doing stuff

$ python script2.py
# 日志:正在做一些事情
# 日志:正在做一些事情

正如你所看到的,当我们运行script2.py时,函数do_stuff被调用了两次。这是因为当我们导入一个模块时,Python会执行模块中的所有代码。所以,当我们在script2.py中导入script1.py时,函数do_stuff被调用了一次。然后,当我们再次调用do_stuff时,它被调用了第二次。

我们如何解决这个问题呢?通过在script1.py中添加if __name__ == "__main__"的检查。这个指令检查脚本是被直接运行还是被导入。如果是被直接运行,那么if块中的代码会被执行,否则不会执行。

```py [script1.py] def do_stuff: print('正在做一些事情')

if name == "main": do_stuff()


现在,当我们直接运行`script1.py`时,函数`do_stuff`只会被调用一次。当我们在`script2.py`中导入`script1.py`时,函数`do_stuff`不会被调用。所以,当我们在`script2.py`中调用`do_stuff`时,它只会被调用一次。

```sh
$ python script1.py
# 日志:正在做一些事情

$ python script2.py
# 日志:正在做一些事情