在Python當中,若是代碼寫得規範一些,一般會寫上一句「if __name__==’__main__:」做爲程序的入口,但彷佛沒有這麼一句代碼,程序也能正常運行。這句代碼多餘嗎?原理又在哪裏?本篇博文對此進行總結說明。程序員
學過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__:」這條代碼的意義之一。spa
咱們知道,當咱們把模塊A中的代碼在模塊B中進行import A時,只要B模塊代碼運行到該import語句,模塊A的代碼會被執行。翻譯
模塊A:code
# 模塊A a = 100 print('你好,我是模塊A……') print(a)
模塊B:orm
# 模塊B from package01 import A b = 200 print('你好,我是模塊B……') print(b)
運行模塊B時,輸出結果以下:blog
你好,我是模塊A……編譯
100form
你好,我是模塊B……class
200
若是在模塊A中,咱們有部分的代碼不想在被導入到B時直接被運行,但在直接運行A時可直接運行,那該怎麼作呢?那就能夠用到「if __name__==’__main__:」這行代碼了,咱們隊上面用到的A模塊代碼進行修改:
A模塊代碼修改成:
# 模塊A a = 100 print('你好,我是模塊A……') if __name__=='__main__': print(a)
B模塊不作修改,直接執行B模塊,輸出結果以下:
你好,我是模塊A……
你好,我是模塊B……
200
看到了嗎,A模塊中的a的值就沒有再被輸出了。因此,當你要導入某個模塊,但又不想改模塊的部分代碼被直接執行,那就能夠這一部分代碼放在「if __name__=='__main__':」內部。
看到如今也許心中仍是疑惑,爲何會這樣,那麼如今咱們來講一說「if __name__=='__main__':」的原理。
「__name__」是Python的內置變量,用於指代當前模塊。咱們修改上面用到的A模塊和B模塊,在模塊中分別輸出模塊的名稱:
模塊A:
# 模塊A print('你好,我是模塊A……') print('模塊A中__name__的值:{}'.format(__name__)) print('-------------------------')
模塊B:
# 模塊B from package01 import A print('你好,我是模塊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__':」下面的代碼塊就會被執行。
「if __name__=='__main__':」語句的用處與原理大概也講清楚了,若是沒說明白,或者是我沒理解到位,請給我留言。另外多說一句,「if __name__=='__main__':」不少時候看似無用,可是,出於代碼的規範性,仍是有必要的。