­

if __name__ == '__main__': 到底是個啥?

  • 2019 年 11 月 13 日
  • 筆記

if __name__ == '__main__'

很多 Python 相關的教程

都是在這裡一筆帶過

有些比較好奇的朋友

想知道為啥要這樣寫

剛好有人問起

今天就來告訴你為啥

當你在寫 .py 的時候

一般是以兩種方式存在的

1、作為腳本直接運行

2、作為模組給別人導入

你的程式碼在被執行的時候

Python 解釋器會先去

讀取你的 Python 程式碼

然後定義一些全局的內置變數

而我們常常寫的這個 __name__

就是其中的變數之一

如果判斷出

__name__ 的值是 __main__

就說明這裡是程式入口

而非被別的 py 文件 import

這裡的運行結果是

程式從上到下按順序運行

先執行的是列印 name

這和 java 有點不同

沒有所謂的主函數

public static void main(String[] args){…}

那麼這個 __name__ 是來幹嘛的

if __name__ == '__main__' 去掉

不也能照樣運行

我們再定義一個方法

專門用來列印變數 __name__ 的值

直接運行

可以看到 __name__ 的值就是 '__main__'

接著換種方式:

我們把這個文件命名為 A.py

作為模組給 B.py 導入

直接 import A

然後運行

運行結果

可以看到

A模組的調用都被執行了

但有一點很不同的是

這裡的 name 值是 A

而不再是 __main__

到這裡,我們就發現了

當 .py 直接運行的時候

__name__的值是__main__

而當 .py 被當作模組導入的時候

__name__的值是模組的名稱

我們接著修改一下 A.py

本來是這樣的

現在改成這樣

再運行 B.py

這次就不會運行到 A 的調用了

所以你的 .py 可以

作為自己的腳本運行

在 __main__ 中做一些測試

或者本身程式的運行

當然你也可以

使用你的 .py 作為模組給別人使用

給別人提供一些便利

為了不讓別人一導入你的模組

就直接運行整個腳本

那麼使用

if __name__ == '__main__'

其中的程式碼就不會在被 import 時被執行。