python中的name等於main是什麼

daxuesheng發表於2021-09-11

python中的name等於main是什麼

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

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

程式入口

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

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

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

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

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

PI = 3.14
def main():
    print("PI:", PI)
main()
# 執行結果:PI: 3.14

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

from const import PI
def calc_round_area(radius):
    return PI * (radius ** 2)
def main():
    print("round area: ", calc_round_area(2))
main()

執行結果

PI: 3.14
round area:  12.56

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

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

PI = 3.14
def main():
    print("PI:", PI)
if __name__ == "__main__":
    main()

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2836429/,如需轉載,請註明出處,否則將追究法律責任。

相關文章