if __name__ == '__main__'詳解


原文:https://www.cnblogs.com/chenhuabin/p/10118199.html

 

 

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模塊代碼運行到該import語句,模塊A的代碼會被執行。

  模塊A:

復制代碼
# 模塊A
 a = 100

print('你好,我是模塊A……') print(a)
復制代碼

  模塊B:

復制代碼
# 模塊B

from package01 import A b = 200

print('你好,我是模塊B……') print(b)
復制代碼

  運行模塊B時,輸出結果如下:

  你好,我是模塊A……

  100

  你好,我是模塊B……

  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__':”內部。

4 “__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__':”下面的代碼塊就會被執行。

5 總結

         “if __name__=='__main__':”語句的用處與原理大概也講清楚了,如果沒說明白,或者是我沒理解到位,請給我留言。另外多說一句,“if __name__=='__main__':”很多時候看似無用,但是,出於代碼的規范性,還是有必要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM