Python中“if __name__=='__main__
1 引言
在Python當中,如果程式碼寫得規範一些,通常會寫上一句“if __name__==’__main__:”作為程式的入口,但似乎沒有這麼一句程式碼,程式也能正常執行。這句程式碼多於嗎?原理又在哪裡?本篇博文對此進行總結說明。
2 程式入口
學過Java、C、C++的程式設計師應該都知道,每次開啟一個程式,都必須寫一個主函式作為程式的入口,也就是我們常說的main函式。如下所示, main()就是Java中的一個main函式。
public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); } }
與Java、C、C++等幾種語言不通的是,Python是一種解釋型指令碼語言,在執行之前不同要將所有程式碼先編譯成中間程式碼,Python程式執行時是從模組頂行開始,逐行進行翻譯執行,所以,最頂層(沒有被縮排)的程式碼都會被執行,所以Python中並不需要一個統一的main()作為程式的入口。在某種意義上講,“if __name__==’__main__:”也像是一個標誌,象徵著Java等語言中的程式主入口,告訴其他程式設計師,程式碼入口在此——這是“if __name__==’__main__:”這條程式碼的意義之一。
3 模組匯入
我們知道,當我們把模組A中的程式碼在模組B中進行import A時,只要B木塊程式碼一執行,模組A的程式碼會率先執行。
模組A:
# 模組Aa = 100print('你好,我是模組A……')print(a)
模組B:
# 模組Bfrom package01 import A b = 200print('你好,我是模組B……')print(b)
執行模組B時,輸出結果如下:
你好,我是模組A……
100
你好,我是模組B……
200
如果在模組A中,我們有部分的程式碼不想在被匯入到B時直接被執行,但在直接執行A時可直接執行,那該怎麼做呢?那就可以用到“if __name__==’__main__:”這行程式碼了,我們隊上面用到的A模組程式碼進行修改:
A模組程式碼修改為:
# 模組Aa = 100print('你好,我是模組A……')if __name__=='__main__': print(a)
B模組不做修改,直接執行B模組,輸出結果如下:
你好,我是模組A……
你好,我是模組B……
200
看到了嗎,A模組中的a的值就沒有再被輸出了。所以,當你要匯入某個模組,但又不想改模組的部分程式碼被直接執行,那就可以這一部分程式碼放在“if __name__=='__main__':”內部。
4 “__name__”與“__main__”
看到現在也許心中還是疑惑,為什麼會這樣,那麼現在我們來所以說“if __name__=='__main__':”的原理。
“__name__”是Python的內建變數,用於自帶當前模組。我們修改上面用到的A模組和B模組,在模組中分別輸出模組的名稱:
模組A:
# 模組Aprint('你好,我是模組A……')print('模組A中__name__的值:{}'.format(__name__))print('-------------------------')
模組B:
# 模組Bfrom package01 import Aprint('你好,我是模組B……')print('模組B中__name__的值:{}'.format(__name__))
執行A模組時,輸出結果:
你好,我是模組A……
模組A中__name__的值:__main__
-------------------------
執行B模組時,輸出結果:
你好,我是模組A……
模組A中__name__的值:package01.A
-------------------------
你好,我是模組B……
模組B中__name__的值:__main__
發現神奇之處了嗎?當哪個模組被直接執行時,該模組“__name__”的值就是“__main__”,當被匯入另一模組時,“__name__”的值就是模組的真實名稱。用一個類比來解釋一下:記得小時候要輪流打算教室,輪到自己的時候(模組被直接執行的時候),我們會說今天是“我”(__main__)值日,稱呼其他人時,我們就會直接喊他們的名字。所以,“__main__”就相當於當事人,或者說第一人稱的“我”。
所以,當執行“if __name__=='__main__':”語句時,如果當前模組時被直接執行,__name__的值就是__main__,條件判斷的結果為True,“if __name__=='__main__':”下面的程式碼塊就會被執行。
5 總結
“if __name__=='__main__':”語句的用處與原理大概也講清楚了,如果沒說明白,或者是我沒理解到位,請給我留言。另外多說一句,“if __name__=='__main__':”很多時候看似無用,但是,出於程式碼的規範性,還是有必要的。
原文出處:https://www.cnblogs.com/chenhuabin/p/10118199.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2471/viewspace-2818945/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中if __name__ == '__main__'作用解析PythonAI
- python中的__name__=='__main__'如何簡單理解PythonAI
- if __name__==”__main__”:AI
- if __name__ == ‘__main__‘AI
- __name__ == “__main__”的作用是什麼?AI
- __name__ == "__main__"的作用是什麼?AI
- 寫了2年python,知道 if __name__ == '__main__' 什麼意思嗎?PythonAI
- ~~物件導向進階(二)——__name__=="__main__"~~物件AI
- __name__ == '__main__' 到底是什麼意思AI
- Python面試|一文讓你讀懂if __name__=='__main__'的含義Python面試AI
- 【Python】__name__ 是什麼?Python
- Python學習筆記|Python之內建變數__name__Python筆記變數
- python二郎成長筆記(一)(pip升級,python入門,基礎,python2和3不同格式帶來的問題,標頭檔案引用的格式,變數的型別,__name__ == '__main__')Python筆記變數型別AI
- 記錄python介面自動化測試--pycharm執行測試用例時需要使用的姿勢(解決if __name__ == "__main__":裡面的程式不生效的問題)(第三目)PythonPyCharmAI
- python(python中的super函式、)Python函式
- python 中的序列Python
- Python中字典dictPython
- Python中的tuplePython
- Python中的dictPython
- python 中的[::-1]Python
- python中的tracebackPython
- python中的binasciiPythonASCII
- Python中的字典Python
- python 中的 flaskPythonFlask
- Python中的字串Python字串
- Python 中 selenium 庫Python
- Python中hash加密Python加密
- python 中 *符號Python符號
- Python基礎之:Python中的類Python
- Python基礎之:Python中的IOPython
- 小白:關於處理“can't find '__main__' module in ”這個問題的詳細處理方式!AI
- python中的過載Python
- Python中的互斥鎖Python
- python中的風險Python
- Python中的正則Python
- python中for……else……的使用Python
- python 中assert的使用Python
- Python中的多程式Python