前言
在我們瀏覽一下 python 檔案或者自己寫 python 程式碼的時候,時常會在程式碼的最後加上這樣的一行程式碼
if __name__ == '__main__':
func_name()
那麼這一行程式碼有什麼具體的作用呢,不加的話會對我們的結果造成影響嗎?
__name__
首先對於用雙下劃線開頭且結尾的變數,在 Python 中被稱為內建變數,除了 __name__
,我們常見的還有 __init__
,__dict__
等等.那麼有多少內建變數呢?我們可以通過下面在互動介面輸入下面的命令,檢視 Python 全部內建變數和內建函式
>>> dir(__builtins__)
結果如下圖:
不同情況下的 __name__
的值
首先我們需要知道 __name__
在不同情況下會有不同值,它的值取決於我們是如何執行指令碼的.我們可以通過幾個例子感受一下:
Example 0
# test.py
print(f'__name__ 在 test.py 值為 {__name__}')
然後直接執行一下程式碼
$ python test.py
然後看一下輸出
$ python test.py
__name__ 在 test.py 值為 __main__
在這個例子中,我們發現 __name__
的值是 __main__
Example 1
在這個例子中,我們重新建立一個指令碼 test1.py 然後我們在 test1.py 中呼叫 test.py
# test1.py
import test
print(f'__name__ 在 test1.py 值為 {__name__}')
接著執行一下 test1.py,再看一下輸出
python test1.py
__name__ 在 test.py 值為 test
__name__ 在 test1.py 值為 __main__
結果是不是很有意思?整個過程是什麼樣子的呢?簡單的畫了一個圖
什麼時候使用 __name__
有時候,我們用 Python 寫了一個指令碼,當我們既希望這個指令碼可以單獨執行,同樣希望它可以在其他的指令碼中發揮作用. 這個時候就需要考慮使用 __name__
了. 這裡通過改造上面 Example 1的例子來直觀感受一下
修改一下 test.py 檔案
# test.py
def hello(name):
print(f'Hello,{name}')
if __name__ == '__main__':
hello("test")
再修改一下 test1.py 檔案
# test1.py
from test import hello
hello("test1")
然後讓我們先嚐試直接執行一下 test.py
,很顯然這個時候, if 語句條件滿足,會輸出 Hello,test
$ python test.py
Hello,test
這個時候我們如果執行 test1.py
,程式就會輸出 Hello,test1 了
$ python test1.py
Hello,test1
如果我們把 if __name__ == "__main__"
在 test.py
去掉會發生什麼呢?
$ python test1.py
Hello,test
Hello,test1