1. 程式人生 > >if __name__ == '__main__'解析

if __name__ == '__main__'解析

相信大家在看別人的python程式時,可能會在大部分的程式後看到標題這段程式碼,這裡解釋下它的意義。總的來說,這句程式碼的作用就是既能保證當前的.py檔案直接執行,也能保證其可以作為模組被其他.py檔案匯入。

下面我將通過幾個例子幫助大家理解
1.py

print(__name__)

我們在1.py中只寫了這麼一段程式碼,輸出結果為下面程式碼

__main__

這說明__name__本身其實就是一個變數,不過比較特殊。實際上,它是在程式執行前就被建立並賦值的,而賦值的機制是這裡的關鍵。在當前程式被當作主程式執行時, __ name__被自動賦值為固定的字串__main

__;當它被當作模組被其他檔案呼叫時,自動被賦值為模組所在的檔名。
2.py

def printhello():
    print("Hello World")
    print(__name__)

if __name__ == '__main__':
    printhello()

輸出:
在這裡插入圖片描述

其實我們可以發現,下面p_l.py中即使不要2.py中的判斷語句也照樣可以執行,且輸出與帶有判斷的一樣:

def printhello():
    print("Hello World")
    print(__name__)

printhello()

可見這句判斷程式碼的作用就是既能保證當前的.py檔案直接執行,也能保證其可以作為模組被其他.py檔案匯入。所以它也可以在當前檔案被當作一個模組匯入時發揮關鍵作用。

但當其不要判斷語句且它被作為模組匯入時,輸出的結果可能就與大家想的有點偏差了。
4.py

from p_l import printhello
printhello()

輸出結果:

Hello World
p_l
Hello World
p_l

首先,可以看到p_l.py在被作為模組調入時,對應的__name__被賦值為對應的檔名,雖然只運行了一遍4.py檔案,但我們可以發現函式執行了兩次,這是因為,不帶判斷語句的p_l.py檔案作為模組被引入時,printhello函式已經自動執行了一次,之後在4.py被主動呼叫時執行了一次,所以一共執行兩次。
那麼,此程式碼的作用已經十分清楚了,它保證模組檔案的函式既能在模組檔案單獨執行,又能保證它被其它.py檔案匯入時,相應的函式不會執行兩次。

所以:
p_l.py

 def printhello():
        print("Hello World")
        print(__name__)
    
    if __name__ == '__main__':
        printhello()

輸出:

Hello World
__main__

4.py:

from p_l import printhello
printhello()

輸出:

Hello World
p_l

這樣就能使p_l.py和4.py都能正常使用printhello函式。