python中的__name__=='__main__'如何簡單理解

Candy_GL發表於2018-09-17

轉自:http://www.cnblogs.com/GGGGGGZX/p/9206806.html

1. 摘要:

通俗的理解_name_ == '_main_':假如你叫小明.py,在朋友眼中,你是小明(_name_ == '小明');在你自己眼中,你是你自己(_name_ == '_main_')。

if _name_ == '_main_'的意思是:當.py檔案被直接執行時,if _name_ == '_main_'之下的程式碼塊將被執行;當.py檔案以模組形式被匯入時,if _name_ == '_main_'之下的程式碼塊不被執行。

2. 程式入口

對於很多程式語言來說,程式都必須要有一個入口,比如C,C++,以及完全物件導向的程式語言Java,C#等。如果你接觸過這些語言,對於程式入口這個概念應該很好理解,C,C++都需要有一個main函式作為程式的入口,也就是程式的執行會從main函式開始。同樣,Java,C#必須要有一個包含Main方法的主類,作為程式入口。

而Python則不同,它屬於指令碼語言,不像編譯型語言那樣先將程式編譯成二進位制再執行,而是動態的逐行解釋執行。也就是從指令碼第一行開始執行,沒有統一的入口。

一個Python原始碼檔案(.py)除了可以被直接執行外,還可以作為模組(也就是庫),被其他.py檔案匯入。不管是直接執行還是被匯入,.py檔案的最頂層程式碼都會被執行(Python用縮排來區分程式碼層次),而當一個.py檔案作為模組被匯入時,我們可能不希望一部分程式碼被執行。

2.1 一個.py檔案被其他.py檔案引用

假設我們有一個const.py檔案,內容如下:


 

現在,我們寫一個用於計算圓面積的area.py檔案,area.py檔案需要用到const.py檔案中的PI變數。從const.py中,我們把PI變數匯入area.py:


 

執行結果:


 

2.2 修改const.py,新增if name == "main"

我們看到const.py中的main函式也被執行了,實際上我們不希望它被執行,因為const.py提供的main函式只是為了測試常量定義。這時if _name_ == '_main_'派上了用場,我們把const.py改一下,新增if _name_ == "_main_":


 

執行const.py,輸出如下:


 

執行area.py,輸出如下:


 

如上,我們可以看到if _name_ == '_main_'相當於Python模擬的程式入口,Python本身並沒有這麼規定,這只是一種編碼習慣。由於模組之間相互引用,不同模組可能有這樣的定義,而程式入口只有一個。到底哪個程式入口被選中,這取決於__name__的值。

相關文章