網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Python中if __name__ == ‘__main__‘作用
要搞清楚這個(gè)問(wèn)題,要知道以py作為后綴的Python代碼文件,有兩種使用方式,第一種方式是直接運(yùn)行,另一種方式是作為模塊被別的py文件導(dǎo)入。
當(dāng)采用第一種方式直接運(yùn)行自身時(shí),__name__的值為_(kāi)_main__;
當(dāng)采用第二種方式被別的模塊導(dǎo)入時(shí),其__name__的值為其文件名(通常也稱(chēng)為模塊名);
舉例實(shí)測(cè)如下:
用PyCharm新建一個(gè)Python工程后,新建兩個(gè)py文件,文件名分別為AAA.py和BBB.py
然后在AAA.py中寫(xiě)上如下代碼:
print('當(dāng)前AAA.py中__name__的值為:', __name__)
在BBB.py中寫(xiě)上如下代碼:
import AAA
然后分別運(yùn)行這兩個(gè)Python文件,結(jié)果如下:
運(yùn)行AAA.py的結(jié)果如下:
運(yùn)行BBB.py的結(jié)果如下:
這個(gè)示例除了應(yīng)證了上面說(shuō)的py文件的兩種使用方式,還表明使用import導(dǎo)入py文件/模塊時(shí),這個(gè)被導(dǎo)入的py文件中沒(méi)有縮進(jìn)的代碼會(huì)被全部執(zhí)行一遍。
這樣就帶來(lái)了一個(gè)問(wèn)題,如果我在導(dǎo)入模塊AAA.py時(shí)如果有想代碼不想被執(zhí)行,那么該怎么做呢?語(yǔ)句“if __name__ == ‘__main__’”就能實(shí)現(xiàn)這個(gè)作用,具體怎么用,有朋友看了上面的例子應(yīng)該已經(jīng)明白了,如果還不明白,請(qǐng)看下面這個(gè)例子:
修改上面的AAA.py的代碼為如下代碼:
print('\n') print('當(dāng)前AAA.py中__name__的值為“{}”'.format(__name__)) if __name__ == '__main__': print('\n') print('當(dāng)前運(yùn)行的文件是AAA.py') else: print('\n') print('當(dāng)前AAA.py是作為模塊被其它py文件導(dǎo)入')
再次分別運(yùn)行AAA.py和BBB.py,結(jié)果分別如下:
可見(jiàn)通過(guò)語(yǔ)句“if __name__ == ‘__main__’,就能判斷出一個(gè)py文件是直接運(yùn)行還是作為模塊文件被別的py文件導(dǎo)入的,進(jìn)而通過(guò)這個(gè)判斷實(shí)現(xiàn)一些代碼的不被執(zhí)行。
那么通常來(lái)說(shuō)哪些代碼不希望被執(zhí)行呢?當(dāng)文件被作者定義為一個(gè)模塊時(shí),里面難免含有一些測(cè)試代碼,當(dāng)模塊被import時(shí),這些代碼是不希望被執(zhí)行的。
補(bǔ)充:if __name__ == '__main__':的運(yùn)行原理
每個(gè)python模塊(python文件,也就是此處的 test.py 和 import_test.py)都包含內(nèi)置的變量 __name__,當(dāng)該模塊被直接執(zhí)行的時(shí)候,__name__ 等于文件名(包含后綴 .py );如果該模塊?import?到其他模塊中,則該模塊的 __name__ 等于模塊名稱(chēng)(不包含后綴.py)。
而?“__main__” 始終指當(dāng)前執(zhí)行模塊的名稱(chēng)(包含后綴.py)。進(jìn)而當(dāng)模塊被直接執(zhí)行時(shí),__name__ == 'main' 結(jié)果為真。
為了進(jìn)一步說(shuō)明,我們?cè)?test.py 腳本的 if __name__=="__main__": 之前加入 print(__name__),即將 __name__ 打印出來(lái)。文件內(nèi)容和結(jié)果如下:
可以看出,此時(shí)變量__name__的值為"__main__"。
再執(zhí)行 import_test.py,執(zhí)行結(jié)果如下:
此時(shí),test.py中的__name__變量值為 test,不滿(mǎn)足 __name__=="__main__" 的條件,因此,無(wú)法執(zhí)行其后的代碼。
總結(jié)
原文鏈接:https://blog.csdn.net/wenhao_ir/article/details/123016649
相關(guān)推薦
- 2022-11-19 通過(guò)?C#/VB.NET?代碼將?Excel?工作表拆分為單獨(dú)的文件_C#教程
- 2022-09-21 Flutter定義tabbar底部導(dǎo)航路由跳轉(zhuǎn)的方法_Android
- 2022-04-25 利用Redis實(shí)現(xiàn)訪問(wèn)次數(shù)限流的方法詳解_Redis
- 2022-06-08 Spring Cloud Ribbon執(zhí)行流程
- 2022-12-11 C語(yǔ)言執(zhí)行時(shí),程序控制臺(tái)輸出窗口?一閃而過(guò)問(wèn)題及解決_C 語(yǔ)言
- 2022-05-23 ELK與Grafana聯(lián)合打造可視化監(jiān)控來(lái)分析nginx日志_nginx
- 2023-05-06 react中定義變量并使用方式_React
- 2022-09-14 Python定制類(lèi)你不知道的魔術(shù)方法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支