關(guān)于Python中的if __name__ == __main__詳情
關(guān)于在學(xué)習(xí)Python的過(guò)程中,遇到的這類(lèi)似的代碼:
if __name__ == "__main__":
print("Hello World!")

1.程序入口
對(duì)于很多編程語(yǔ)言來(lái)說(shuō),程序都必須要有一個(gè)入口,比如 C,C++,以及完全面向?qū)ο蟮木幊陶Z(yǔ)言 Java,C# 等。如果你接觸過(guò)這些語(yǔ)言,對(duì)于程序入口這個(gè)概念應(yīng)該很好理解,C 和 C++ 都需要有一個(gè) main 函數(shù)來(lái)作為程序的入口,也就是程序的運(yùn)行會(huì)從 main 函數(shù)開(kāi)始。同樣,Java 和 C# 必須要有一個(gè)包含 Main 方法的主類(lèi)來(lái)作為程序入口。
而 Python 則有不同,它屬于腳本語(yǔ)言,不像編譯型語(yǔ)言那樣先將程序編譯成二進(jìn)制再運(yùn)行,而是動(dòng)態(tài)的逐行解釋運(yùn)行。也就是從腳本第一行開(kāi)始運(yùn)行,沒(méi)有統(tǒng)一的入口。
if __name__ == “__main__”: 本質(zhì)就是一個(gè)if判斷,但它又不是一個(gè)簡(jiǎn)單的if判斷。即當(dāng).py文件運(yùn)行時(shí),__name__ 是'__main__' 時(shí)運(yùn)行下面if下的代碼,則否不運(yùn)行。當(dāng)然你也可以把代碼寫(xiě)成這樣:
if __name__ == "__main__":
print("Hello World!")
else:
print("Hello Mars!")
2.__name__是什么?
__name__是Python內(nèi)置的變量,它是每個(gè) Python 模塊必備的屬性,但它的值取決于你是如何執(zhí)行這段代碼的。
當(dāng)你直接執(zhí)行一段腳本的時(shí)候,這段腳本的 __name__變量等于 ‘__main__'
當(dāng)這段腳本被導(dǎo)入其他程序的時(shí)候,__name__ 變量等于腳本本身的名字
場(chǎng)景1:直接運(yùn)行腳本
假設(shè)我們有一個(gè)nameScript.py,代碼如下:
def myFunction():
print('The value of __name__ is ' + __name__)
def main():
myFunction()
if __name__ == '__main__':
main()
直接執(zhí)行這個(gè)文件后流程為:

在所有其他代碼執(zhí)行之前,__name__變量就被設(shè)置為 ‘__main__' 了。在此之后,通過(guò)執(zhí)行 def 語(yǔ)句,函數(shù) main() 和 myFunction() 的本體被載入。接著,因?yàn)檫@個(gè) if 語(yǔ)句后面的表達(dá)式為真 true,函數(shù) main() 就被調(diào)用了。而 main() 函數(shù)又調(diào)用了myFunction(),打印出變量的值'__main__'。
場(chǎng)景2:從其他腳本導(dǎo)入
如果你需要在其他腳本里重用這個(gè) myFunction() 函數(shù),比如在 importingScript.py 里,我們可以將 nameScript.py 作為一個(gè)模組導(dǎo)入。
importingScript.py 的內(nèi)容如下:
import nameScript as ns ns.myFunction()
這時(shí),我們就有了兩個(gè)不同的作用域:一個(gè)是 importingScript 的,一個(gè)是 nameScript 的:

在 importingScript.py 里,__name__ 變量就被設(shè)置為 ‘__main__'。當(dāng)導(dǎo)入 nameScript 的時(shí)候,Python 就在本地和環(huán)境變量 PATH 指向的路徑中尋找對(duì)應(yīng)名稱的 .py 文件,找到之后,將會(huì)運(yùn)行導(dǎo)入的文件中的代碼。
但這一次,在導(dǎo)入的時(shí)候,它自身的 __name__ 變量就被設(shè)置為了 ‘nameScript',接下來(lái)還是一樣,函數(shù) main() 和 myFunction() 的本體被載入。然而,這一次 if 語(yǔ)句后面的表達(dá)式結(jié)果為假 false,所以 main() 函數(shù)沒(méi)有被調(diào)用。
導(dǎo)入完畢之后,回到 importingScript.py 中?,F(xiàn)在 nameScript 模塊中的函數(shù)定義已經(jīng)被導(dǎo)入到當(dāng)前的作用域中,于是我們通過(guò) ns.myFunction() 的方式調(diào)用模塊中的函數(shù),這個(gè)函數(shù)返回的是模塊內(nèi)的變量的值 ‘nameScript'。
如果你試著在 importingScript 中打印 __name__ 變量的值,那當(dāng)你直接執(zhí)行 importingScript 的時(shí)候,它也會(huì)輸出 ‘__main__'。原因在于,這個(gè)變量是在 importingScript 的作用域中的。
3.__name__可以顯示包路徑
我們建立這樣一個(gè)目錄結(jié)構(gòu):
a ├── b │ ├── c.py │ └── __init__.py └── __init__.py d.py
c.py文件中的代碼:
print(__name__)
d.py文件中的代碼:
from a.b import c
運(yùn)行d.py文件,結(jié)果為:
a.b.c
此時(shí)a.py文件的__name__屬性變成了a.b.c,完完全全反映了它所在的包路徑。
5.測(cè)試模塊里函數(shù)
由于一個(gè)腳本被引入時(shí),自身的代碼會(huì)被執(zhí)行,因此我們?cè)诿總€(gè)腳本里都寫(xiě)上一段if __name__ == ‘__main__': 如果你希望一些代碼只有在腳本被直接執(zhí)行時(shí)才執(zhí)行,那么就把這些代碼放入到if 語(yǔ)句塊中,最常見(jiàn)的情形就是測(cè)試代碼:
def safe_division(a, b):
if b == 0:
return None
return a/b
if __name__ == '__main__':
print(safe_division(10, 5) == 2)
print(safe_division(10, 0) == None)
我們寫(xiě)完一個(gè)函數(shù)后,不免要寫(xiě)一些測(cè)試的代碼,而這些測(cè)試的代碼我們不希望他們?cè)谝霑r(shí)執(zhí)行,只有當(dāng)我們主動(dòng)執(zhí)行進(jìn)行測(cè)試才執(zhí)行這些測(cè)試代碼。
到此這篇關(guān)于關(guān)于Python中的if __name__ == ‘__main__'詳情的文章就介紹到這了,更多相關(guān)Python中的if __name__ == ‘__main__'內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中if __name__ == "__main__"詳細(xì)解釋
- 正確理解Python中if __name__ == ''__main__''
- Python中if?__name__==‘__main__‘用法詳情
- Python中if __name__ == ''__main__''作用解析
- 聊聊Python代碼中if?__name__?==?‘__main__‘的作用是什么
- 一篇文章徹底弄懂Python中的if?__name__?==?__main__
- 深入理解python中if?__name__?==?‘__main__‘
- Python中if __name__ == “__main__“的作用總結(jié)
相關(guān)文章
Python?pip下載包及所有依賴到指定文件夾的步驟說(shuō)明
為了方便開(kāi)發(fā)和部署,我們常常需要將Python項(xiàng)目所依賴的第三方包導(dǎo)出到本地文件夾中,這篇文章主要介紹了Python?pip下載包及所有依賴到指定文件夾的步驟說(shuō)明,需要的朋友可以參考下2025-06-06
python?離散點(diǎn)圖畫(huà)法的實(shí)現(xiàn)
本文主要介紹了python?離散點(diǎn)圖畫(huà)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
numpy 數(shù)組拷貝地址所引起的同步替換問(wèn)題
本文主要介紹了numpy 數(shù)組拷貝地址所引起的同步替換問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
python神經(jīng)網(wǎng)絡(luò)之批量學(xué)習(xí)tf.train.batch函數(shù)示例
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)之批量學(xué)習(xí)tf.train.batch函數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python 動(dòng)態(tài)渲染 mysql 配置文件的示例
這篇文章主要介紹了python 動(dòng)態(tài)渲染 mysql 配置文件的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
python腳本爬取字體文件的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了利用python腳本爬取字體文件的實(shí)現(xiàn)方法,文中分享了爬取兩個(gè)不同網(wǎng)站的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04
Python學(xué)習(xí)筆記之常用函數(shù)及說(shuō)明
俗話說(shuō)“好記性不如爛筆頭”,老祖宗們幾千年總結(jié)出來(lái)的東西還是有些道理的,所以,常用的東西也要記下來(lái),不記不知道,一記嚇一跳,乖乖,函數(shù)咋這么多捏2014-05-05

