__name__ == '__main__' 到底是什么意思
__name__ == '__main__'到底是什么意思
相信許多人初學 Python 時,常會在例子程序中看到如下語句:
if __name__ == '__main__':foo() # 或其他語句第 1 行的__name__ == '__main__'到底是什么意思呢?
首先,如果你永遠都只執行一個 xxx.py,而不去 import它的話,那你完全不需要了解這是什么。例如你寫了一個程序,文件名叫 hello.py
print("====this is hello.py====") def foo():print("hello") print("call foo() which is defined here") foo() print("====this is hello.py END ====")然后你總是直接執行它,就像這樣
$ python3 hello.py ====this is hello.py==== call foo() which is defined here hello ====this is hello.py END ====這完全沒有問題。
但是,當別人想引用你的foo()函數時,就有問題了。
例如別人寫了一個文件,名字是 world.py
# world.py print("====this is world.py====") from hello import fooprint("call foo() which is defined in other file") foo() print("====this is world.py END ====")運行結果如下:
$ python3 world.py ====this is world.py==== ====this is hello.py==== call foo() which is defined here hello ====this is hello.py END ==== call foo() which is defined in other file hello ====this is world.py END ====可以看到,解釋器是逐行解釋源碼的,當執行到源碼的第 3 行時,也就是 hello.py 被引用時,hello.py 的每一行都會被解釋器讀取并執行,執行效果就是結果中的3~6行,然后解釋器執行源碼的5~7行。
如果你不想要結果中的3~6行,該怎么做呢?
Python 解釋器執行代碼時,有一些內建、隱含的變量,__name__就是其中之一,其意義是“模塊名稱”。
如果該模塊是被引用,那么__name__的值會是此模塊的名稱;如果該模塊是直接被執行,那么__name__的值是__main__。
或許你還不明白,那我們來做個實驗。
# hello.py print("====this is hello.py====") print(__name__) def foo():print("Ha") print("call foo() which is defined here") foo() print("====this is hello.py END ====")請注意上面第3行
# world.py print("====this is world.py====") print(__name__) from hello import foo print("call foo() which is defined in other file") foo() print("====this is world.py END ====")同樣,請注意上面第3行
我們看一下運行結果。
對于第一個:
$ python3 hello.py ====this is hello.py==== __main__ call foo() which is defined here Ha ====this is hello.py END ====從結果的第3行可以看出,對于直接運行的模塊,其模塊名是 __main__
對于第二個:
$ python3 world.py ====this is world.py==== __main__ # 因為 world.py 被直接執行,所以這里的值是 __main__ ====this is hello.py==== hello # 因為 hello.py 被引用,所以這里的值是 hello call foo() which is defined here Ha ====this is hello.py END ==== call foo() which is defined in other file Ha ====this is world.py END ====注意到第5行了嗎?這里的“hello”正是 hello.py 被引用時的模塊名稱。
由此可見,__name__的值在模塊被直接執行時與被引用時是不同的。
回到上面的問題:當一個模塊被引用時,如何不執行該模塊的語句?答案就是靠判斷__name__是否等于 __main__。當一個模塊被直接執行時,其__name__必然等于__main__;當一個模塊被引用時,其__name__必然等于文件名(不含.py);
總結
之所以常看見這樣的寫法,是因為該程序可能有“單獨執行”(例如執行一些單元測試)與“被引用”兩種情況,鑒于這兩種情況中__name__的值是不同的:當一個模塊被直接執行時,其__name__必然等于__main__;當一個模塊被引用時,其__name__必然等于文件名(不含.py)。所以利用判斷__name__ == '__main__'的真假就可以將這兩種情況區分出來。
參考資料
http://blog.castman.net/教學/2018/01/27/python-name-main.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的__name__ == '__main__' 到底是什么意思的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两数之和(Leetcode第1题)
- 下一篇: 快乐数(Leetcode第202题)