玩一玩python的特殊變數 __name__
python特殊變數__name__
在一些程式碼中會發現這樣的變量出現__name__
,這個變數我感覺,說實話有點醜,那要是人名,那對應的可能是一二三狗子三二一
。說到醜啊,我實在是不得不想起之前的一個事情
“身份證為什麼拍得這麼醜?”
因為拍的太漂亮太好看,你就會到處炫耀,誰知道哪一天給別人欣賞你的“秀色可餐”的面容的時候忘記拿回來,弄丟了。想想也覺得很有道理!真的感謝公安人員的良苦用心啊!!!
這個變數就是python的內建變數
,寫成這樣就是防止你程式設計的時候取變數名的用到這個名字
,你會用一二三狗子三二一
給自己的娃取名?(變數命名要麼是_
開頭,要麼是英文字母
開頭)。那它表示什麼意思呢?
它的意思就是執行的程式的名字(name)。
首先寫一個簡單的python
程式看一看,把這句話存到test.py
中執行一下:
print("NAME IS : " + __name__)
執行python test.py
,結果是:
NAME IS : __main__
咋地又來了一個一二三翠花三二一
(__main__
)?哈哈,你沒有看錯,這個內建變數的真實名字(值)是__main__
。
好吧!感覺python
這個世界有著形形色色的變數啊!
那它有著啥子用呢?
在一些程式碼中你可能經常看到這個寫法:
if __name__ == '__main__': balabala...
程式碼翻譯過來就是,如果這個程式的名字
是__main__
,那麼就balabala...
,那剛才我們試了,程式的名字就是__main__
這個翠花大西瓜啊!為啥還做這個判斷呢?難道是下雨天打孩子——閒著也是閒著?
嘿!如果把__name__
放在函式裡面是不是會神祕一些呢?我們把下面這些程式碼儲存到cuihua_and_dog.py
裡面
# cuihua_and_dog.py # 宣告一個函式,這個用來試驗(名字我都給取好了,叫翠花狗子) def marry(): baby = "cuihua" + "dog" print(__name__ + "'s baby is : " + baby) marry()
當直接執行python cuihua_and_dog.py
的,結果是:
__main__'s baby is : cuihuadog
結果__name__
還是和之前的那樣,還是__main__
這樣太直接的執行cuihua_and_dog.py
實在是沒意思,我們來回到狗子翠花小的時候!我們不這麼直接的執行它,我們把它當做模組或者說包來執行看看會怎樣!把cuihua_and_dog.py
的marry()
刪除,在test.py
裡面執行marry()這個方法
,然把之前的test.py
裡面的內容換成下面這個,(記得把test.py
和cuihua_and_dog.py
這兩個檔案放在一個資料夾裡面)
# test.py # 從cuihua_and_dog包裡面匯入marry方法到這裡來 from cuihua_and_dog import marry marry()
然後執行python test.py
,結果是:
cuihua_and_dog's baby is : cuihuadog
__name__
名字終於變了,看來老天也覺得這個名字好!就這個了翠花狗子
,哈哈!
按照上面看,cuihua_and_dog.py
在兩種不同的執行方式裡,__name__
不一樣:
cuihua_and_dog.py-->__mian__ +----------+/ ||/ 直接執行 | __name__ | ------- ||\ 當做包執行 +----------+\ -->cuihua_and_dog
就是說,當這個程式直接執行的時候,__name__
的值就是__main__
,如果作為包執行的時候就是包名。
回到剛才那個if __name__ == '__main__':
這句話上面來,想一下,如果說是直接執行這個程式的話,那麼這個判斷就成立了,那就執行if
裡面的程式碼;如果是被當做包執行,那就不會執行if
裡面的程式碼。
但是翠花和狗子小時候(當做包執行)怎麼可能會結婚呢?這樣做不行,既然可以用if
來判斷,我們改一下cuihua_and_dog.py
裡面的程式碼:
# cuihua_and_dog.py def marry(): if __name__ == "__main__":# 翠花狗子長大了(直接執行) baby = "cuihua" + "dog" print("baby is : " + baby) else:# 翠花狗子還是小時候(被當做包匯入執行) print("They are the babys! It is a guojiajia game!") # 翠花狗子長大了(直接執行) if __name__ == "__main__": marry()
這樣我們在回頭來執行一下python test.py
,結果是:
They are the babys! It is a guojiajia game!
但是當翠花和狗子長大了(我們直接執行)的時候python cuihua_and_dog.py
,結果是
baby is : cuihuadog
好的,狗子與翠花的故事完結了,很圓滿。
總結
-
如果直接執行某個
.py
檔案的時候,這個檔案裡面的__name__
就是__main__
,如果不是直接執行,而是被另外一個.py
檔案import
的時候,這個檔案裡面的__name__
是這個py
的檔名。 -
使用這個
__name__
可以對程式進行除錯,如果說當程式之間互相之間呼叫,比較複雜的關係的時候,使用if __name__ == '__main__':
將執行的程式碼放在裡面,在執行其他的程式的時候,測試的程式本身不會執行,而這個程式有問題的時候,可以執行這個檔案,那麼if __name__ == '__main__':
裡面的程式碼就執行了。 - 或者可以在不同的場景中來做不同的配置,作為包的時候是一套配置,作為主執行程式的時候又是另外一套配置,以應對不同的情況。