網站首頁 編程語言 正文
Python中if __name__ == ‘__main__‘作用
要搞清楚這個問題,要知道以py作為后綴的Python代碼文件,有兩種使用方式,第一種方式是直接運行,另一種方式是作為模塊被別的py文件導入。
當采用第一種方式直接運行自身時,__name__的值為__main__;
當采用第二種方式被別的模塊導入時,其__name__的值為其文件名(通常也稱為模塊名);
舉例實測如下:
用PyCharm新建一個Python工程后,新建兩個py文件,文件名分別為AAA.py和BBB.py
然后在AAA.py中寫上如下代碼:
print('當前AAA.py中__name__的值為:', __name__)
在BBB.py中寫上如下代碼:
import AAA
然后分別運行這兩個Python文件,結果如下:
運行AAA.py的結果如下:
運行BBB.py的結果如下:
這個示例除了應證了上面說的py文件的兩種使用方式,還表明使用import導入py文件/模塊時,這個被導入的py文件中沒有縮進的代碼會被全部執行一遍。
這樣就帶來了一個問題,如果我在導入模塊AAA.py時如果有想代碼不想被執行,那么該怎么做呢?語句“if __name__ == ‘__main__’”就能實現這個作用,具體怎么用,有朋友看了上面的例子應該已經明白了,如果還不明白,請看下面這個例子:
修改上面的AAA.py的代碼為如下代碼:
print('\n') print('當前AAA.py中__name__的值為“{}”'.format(__name__)) if __name__ == '__main__': print('\n') print('當前運行的文件是AAA.py') else: print('\n') print('當前AAA.py是作為模塊被其它py文件導入')
再次分別運行AAA.py和BBB.py,結果分別如下:
可見通過語句“if __name__ == ‘__main__’,就能判斷出一個py文件是直接運行還是作為模塊文件被別的py文件導入的,進而通過這個判斷實現一些代碼的不被執行。
那么通常來說哪些代碼不希望被執行呢?當文件被作者定義為一個模塊時,里面難免含有一些測試代碼,當模塊被import時,這些代碼是不希望被執行的。
補充:if __name__ == '__main__':的運行原理
每個python模塊(python文件,也就是此處的 test.py 和 import_test.py)都包含內置的變量 __name__,當該模塊被直接執行的時候,__name__ 等于文件名(包含后綴 .py );如果該模塊?import?到其他模塊中,則該模塊的 __name__ 等于模塊名稱(不包含后綴.py)。
而?“__main__” 始終指當前執行模塊的名稱(包含后綴.py)。進而當模塊被直接執行時,__name__ == 'main' 結果為真。
為了進一步說明,我們在 test.py 腳本的 if __name__=="__main__": 之前加入 print(__name__),即將 __name__ 打印出來。文件內容和結果如下:
可以看出,此時變量__name__的值為"__main__"。
再執行 import_test.py,執行結果如下:
此時,test.py中的__name__變量值為 test,不滿足 __name__=="__main__" 的條件,因此,無法執行其后的代碼。
總結
原文鏈接:https://blog.csdn.net/wenhao_ir/article/details/123016649
相關推薦
- 2022-11-23 C語言學習之關鍵字的示例詳解_C 語言
- 2022-02-07 SSH連服務器提示“Permission denied(publickey,gssapi-keyex
- 2021-12-12 超快速上手jupyter notebook快捷鍵操作(兩種模式一個快捷鍵)
- 2022-09-07 Python中的if判斷語句中包含or問題_python
- 2023-01-14 C++?win系統如何用MinGW編譯Boost庫_C 語言
- 2023-01-28 C#實現自定義單選和復選按鈕樣式_C#教程
- 2022-04-09 Python中緩存lru_cache的基本介紹和講解_python
- 2022-06-22 使用Git?Bash向GitHub上傳本地項目_其它綜合
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支