if __name__ == ‘__main__’到底是什麼?
引子
要搞清楚這個問題,可以先聽一個故事~~~
像我們做事一樣,都需要一個起始點,終點存在與否無關緊要。編程也是一樣,任何程序都有一個入口,在所謂的靜態編譯語言中,如Java
的入口是一個名字叫做Main
的類,所有的程序都必須從這裡開始運行,因此讀別人的Java
代碼很方便,直接找入口就可以了。而Python
這種動態解釋型的語言不一樣,他的入口就是程序的第一行,從代碼開始書寫的地方一直讀到程序末尾,這就很有意思了,為了讓程序員讀別人的代碼更方便,也為了讓程序輸出更為簡潔,約定俗成了一種規範,即模仿Java
,使用if __name__ == '__main__'
給程序設定一個入口。
if __name__ == '__main__'
是為了使Python
更優雅而約定俗成的一個程序入口。
但是,這個程序入口和Java
略有不同:
Java
強製程序所有的輸入輸出、流程控制等都在Main
類裏面;Python
只是使用if __name__ == '__main__'
保證不是同一個模塊的輸入輸出、流程控制等不相互影響。
分步驟詳細舉例說明
什麼是
__name__
?
新建一個Python程序,a.py
# a.py
print('a.py':__name__)
輸出:
a.py:__main__
再新建一個Python程序,b.py
# b.py
import a
# 當前程序包的名字
print('b.py':__name__)
# b.py程序的名字
print('a.py':a.__name__)
運行b.py
,輸出:
b.py:__main__
a.py:a
小結
__name__
是程序的名稱,當前運行程序的__name__
是__main__
,非當前運行程序的名稱為程序的模塊名稱,即自定義值。
如果程序裏面含有程序入口,那麼程序如何執行呢?
即Python
只是使用if __name__ == '__main__'
保證不是同一個模塊的輸入輸出、流程控制等不相互影響。如何解釋呢?
# a.py
print('01:首先執行這一行代碼')
if __name__ == '__main__':
print('02:然後執行這一行代碼')
運行a.py
,輸出:
01:首先執行這一行代碼
02:然後執行這一行代碼
以上說明,python
是順序執行的,這個所謂的程序入口並不能改變執行順序。
如果程序長這樣呢?
# a.py
print('a-01:這是a程序的輸出')
--------------------------
# b.py
import a
if __name__ == '__main__':
print('b-01:這是b程序的輸出')
運行b.py
,輸出:
a-01:這是a程序的輸出
b-01:這是b程序的輸出
可見,又一次證明程序是順序執行的,而且程序入口並沒有起作用。
那麼,這個程序入口的作用是什麼呢?
# a.py
if __name__ == '__main__':
print('a-01:這是a程序的輸出')
--------------------------
# b.py
import a
if __name__ == '__main__':
print('b-01:這是b程序的輸出')
運行b.py
,輸出:
b-01:這是b程序的輸出
這次成功阻止了a.py
程序的輸出,可以輕鬆理解:Python
只是使用if __name__ == '__main__'
保證不是同一個模塊的輸入輸出、流程控制等不相互影響。
小結
為了更簡潔優雅的使用
Pyhton
十分建議將每個模塊的執行邏輯和輸入輸出都放在程序入口裏面,這樣在調用時不會污染程序上下文執行環境。