(轉)if __name__ == '__main__' 如何正確理解?
原文:https://www.zhihu.com/question/49136398
作者:初識CV連結:https://www.zhihu.com/question/49136398/answer/1654722335
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
Python中“if __name__=='__main__':”的詳細解答。
__name__是魔法函式的一種,如果大家想詳細瞭解和魔法函式相關的知識點選這裡,裡面整理了Python中常見的魔法函式用法,都有詳細的程式碼解析:初識CV:Python:例項講解Python中的魔法函式(高階語法)871 贊同 · 47 評論文章
引言
學過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__:”這條程式碼的意義之一。
1. __name__的理解
1.1 為什麼使用__name__屬性?
Python直譯器在匯入模組時,會將模組中沒有縮排的程式碼全部執行一遍(模組就是一個獨立的Python檔案)。開發人員通常會在模組下方增加一些測試程式碼,為了避免這些測試程式碼在模組被匯入後執行,可以利用__name__屬性。
1.2 __name__屬性。
__name__屬性是Python的一個內建屬性,記錄了一個字串。
- 若是在當前檔案,__name__ 是__main__。
- 在hello檔案中列印本檔案的__name__屬性值,顯示的是__main__
- 若是匯入的檔案,__name__是模組名。
- test檔案匯入hello模組,在test檔案中打印出hello模組的__name__屬性值,顯示的是hello模組的模組名。
因此__name__ == '__main__' 就表示在當前檔案中,可以在if __name__ == '__main__':條件下寫入測試程式碼,如此可以避免測試程式碼在模組被匯入後執行。
2. 模組匯入
我們知道,當我們把模組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__':”內部。
3. “__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__':”下面的程式碼塊就會被執行。
如果大家對影象分類和檢測(Python版)感興趣的點選下面:
初識CV:目標檢測比賽中的tricks(已更新更多程式碼解析)818 贊同 · 167 評論文章 初識CV:影象分類比賽tricks:“觀雲識天”人機對抗大賽:機器影象演算法賽道-天氣識別—百萬獎金65 贊同 · 55 評論文章 初識CV:影象分類比賽tricks:華為雲人工智慧大賽·垃圾分類挑戰杯45 贊同 · 96 評論文章參考
- ^Python中“if __name__=='__main__':”理解與總結https://www.cnblogs.com/chenhuabin/p/10118199.html
- ^if __name__ == '__main__':https://www.cnblogs.com/wanao/p/13098783.html