日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

__name__ == '__main__' 到底是什么意思

發(fā)布時間:2025/3/15 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 __name__ == '__main__' 到底是什么意思 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

__name__ == '__main__'到底是什么意思

相信許多人初學 Python 時,常會在例子程序中看到如下語句:

if __name__ == '__main__':foo() # 或其他語句

第 1 行的__name__ == '__main__'到底是什么意思呢?

首先,如果你永遠都只執(zhí)行一個 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 ====")

然后你總是直接執(zhí)行它,就像這樣

$ 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 ====

可以看到,解釋器是逐行解釋源碼的,當執(zhí)行到源碼的第 3 行時,也就是 hello.py 被引用時,hello.py 的每一行都會被解釋器讀取并執(zhí)行,執(zhí)行效果就是結果中的3~6行,然后解釋器執(zhí)行源碼的5~7行。

如果你不想要結果中的3~6行,該怎么做呢?

Python 解釋器執(zhí)行代碼時,有一些內建、隱含的變量,__name__就是其中之一,其意義是“模塊名稱”。

如果該模塊是被引用,那么__name__的值會是此模塊的名稱;如果該模塊是直接被執(zhí)行,那么__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 被直接執(zhí)行,所以這里的值是 __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__的值在模塊被直接執(zhí)行時與被引用時是不同的。

回到上面的問題:當一個模塊被引用時,如何不執(zhí)行該模塊的語句?答案就是靠判斷__name__是否等于 __main__。當一個模塊被直接執(zhí)行時,其__name__必然等于__main__;當一個模塊被引用時,其__name__必然等于文件名(不含.py);

總結

之所以常看見這樣的寫法,是因為該程序可能有“單獨執(zhí)行”(例如執(zhí)行一些單元測試)與“被引用”兩種情況,鑒于這兩種情況中__name__的值是不同的:當一個模塊被直接執(zhí)行時,其__name__必然等于__main__;當一個模塊被引用時,其__name__必然等于文件名(不含.py)。所以利用判斷__name__ == '__main__'的真假就可以將這兩種情況區(qū)分出來。

參考資料

http://blog.castman.net/教學/2018/01/27/python-name-main.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的__name__ == '__main__' 到底是什么意思的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。