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 時被執行。