if __name__ == __main__ 如何正確理解?
if __name__ == "__main__"
這段代碼怎麼理解??
__name__ 是當前模塊名,當模塊被直接運行時模塊名為 __main__ 。這句話的意思就是,當模塊被直接運行時,以下代碼塊將被運行,當模塊是被導入時,代碼塊不被運行。
--------------------------------------------------
目測有很多人對這個問題理解得不是很深刻,應該大部分都是 Python 初學者,所以特意寫了篇文章來講解這個問題:Python 中的 if __name__ == #x27;__main__#x27; 該如何理解。
小明.py
朋友眼中你是小明(__name__ == "小明"),
你自己眼中你是你自己(__name__ == "__main__"), 你編程很好, 朋友調你去幫他寫程序(import 小明, 這時你在朋友眼中: __name__ == "小明"),但你晚上也會打開xx網站, 做一些自己的事情(直接運行小明.py, __name__ == "__main__")hhaha貌似昨天還是前天看過這個~現學現賣一下,有錯誤的話大家走過路過請指正一下~謝謝!我的理解是,嗚嗚為什麼我感覺我可以理解但是說不出來。。。我是看下面這段代碼懂了的,引用自python - What does if __name__ == "__main__" do?其中Adam Rosenfield的回答。
# file one.py
def func():
print("func() in one.py")
print("top-level in one.py")
if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported into another module")
# file two.py
import one
print("top-level in two.py")
one.func()
if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported into another module")
如果你執行one.py文件,
python one.py
會輸出:
top-level in one.py
one.py is being run directly
如果你執行two.py文件,
python two.py
會輸出:
top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly
Thus, when module one gets loaded, its __name__ equals "one" instead of __main__.
我就不翻譯了首先我翻譯的很醜其次我覺得英文更好理解。。。
它就是上面這麼用的。
然後我覺得它的功能就是,讓if __name__ == "__main__"它後面的代碼不執行。這樣代碼運行會更簡潔更流暢???因為只需要用想用的那部分就行了。。。
每個人天生都自帶一些技能的,比如有時候,我們因為某種原因,在月黑風高的夜裡,外面寒風陣陣,屋內對影而做,甚是寂寞。這時候我們可能就需要排解一下。
這時候你做的一些不可描述的事情可以理解為if __name__ == "__main__" 裡面的內容。
但是如果平時你在朋友面前做這種事當然就不合適了,所以在公眾場合,
我們別的技能,比如打籃球啊,去星巴克碼代碼啊,這些技能是可以被啟用的,這個就是除if __name__ == "__main__" 之外的代碼能夠被調用。
在Python中,一個.py文件就是一個模塊,一般情況下,模塊的名字就是文件名(不包括擴展名.py)。
全局變數__name__存放的就是模塊的名字。
而特殊情況就是,當一個模塊作為腳本執行時或者在互動式環境中,如Ipython、Python自帶的shell等直接運行代碼,__name__的值不再是模塊名,而是__main__。__main__是頂層代碼執行作用域的名字。
參見__main__ — Top-level script environment:
A module can discover whether or not it is running in the main scope by checking its own __name__, which allows a common idiom for conditionally executing code in a module when it is run as a script or with python -m but not when it is imported:
if __name__ == "__main__":
# execute only if run as a script
main()
也就是說,通過__name__的值,我們可以判斷出該模塊是作為腳本正在執行還是被其他模塊導入,而根據這個判斷,我們就可以選擇性地執行代碼。將只有模塊作為腳本執行時的代碼放入到
if __name__ == "__main__":
條件中,比如執行單元測試等。
而當模塊被其他模塊通過import等語句導入時,Python解釋器會首先檢查模塊註冊表sys.modules中是否有該模塊,如果有,則直接利用存在的模塊對象的名字空間中的變數;如果沒有,創建一個空的模塊對象,將其添加到sys.modules中,在以該模塊名為名的名字空間下執行該模塊,除了if __name__ == "__main__": 條件中的代碼,而被執行代碼中定義的變數在該名字空間下都是可訪問的。
請看這樣理解python中的if __name__ == "__main__"
https://zhuanlan.zhihu.com/p/21297237
對於很多編程語言來說,程序都必須要有一個入口,比如C,C++,以及完全面向對象的編程語言Java,C#等。
如果你接觸過這些語言,對於程序入口這個概念應該很好理解,C,C++都需要有一個main函數作為程序的入口,也就是程序的運行會從main函數開始。同樣,Java,C#必須要有一個包含Main方法的主類,作為程序入口。
而Python則不同,它屬於腳本語言,不像編譯型語言那樣先將程序編譯成二進位再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口。
一個Python源碼文件(.py)除了可以被直接運行外,還可以作為模塊(也就是庫),被其他.py文件導入。
不管是直接運行還是被導入,.py文件的最頂層代碼都會被運行(Python用縮進來區分代碼層次),而當一個.py文件作為模塊被導入時,我們可能不希望一部分代碼被運行。
int main(void){
}
上面是C語言中主函數的聲明,從計算機的角度來說,當編譯執行此段話時,相當於告訴它:該幹活了。幹什麼活呢?就是對於主函數內部的代碼進行"操作",一般來說此時所有的函數聲明,結構定義等都已被編譯完成,只等main函數出現,便可以最終生成可執行文件對象。
在Python中也是一樣,main函數代表了程序入口(被藏起來了)。
現在假設有一個文件c.py,裡面包含了一段類定義的代碼和實例化的操作,那麼在看見
if __name__ == "main":
之後,就會判斷這個文件的程序入口是不是main(把Python中的程序想像成一個類,那麼__name__就相當於構造函數里的__self__),換句話說,如果這個文件是正在執行的,那麼它的入口必然是"main"
相反地,如果有一個文件b.py,其中調用了這個c中類的定義,那麼結果將是未定義的,即無法在b中調用此類對象。
__name__是module的屬性,直接執行這個module(.py)的時候變成__main__,所以這段代碼是用來判斷這個module是被import了還是被執行了(用來區別執行def的和main( )函數)
編寫私有化部分 ,這句代碼以上的部分,可以被其它的調用,以下的部分只有這個文件自己可以看見,如果文件被調用了,其他人是無法看見私有化部分的
如果你在任何一個py文件中執行print(__name__), 會返回__main__,這是Python的一個內置變數,任何python文件都一樣;
如果你在文件A中寫入print( __name__),然後在文件B中Import A,執行B,那麼會返回A文件的文件名,而不是__main__;
所以其實在代碼中使用 if __name__ == "__main__",相當於使用一個if判斷,在此if條件下的內容不會在被引入模塊的文件中調用,因為不是在當前py文件中直接調用,__name__會等於被引模塊的文件名。
有aaa.py和bbb.py兩個Python文件,aaa.py 有需要import bbb.py的功能 。當執行運行aaa.py,aaa.py中的__name__值為__main__,此時bbb.py中的__name__值為bbb.py(模塊名本身)。這時aaa.py 中if(__name__=="__main__")判斷為true正常執行,bbb.py中的if(__name__=="__main__")為false跳過不執行。這樣做可以既方便Python單個文件單獨調試,又方便跨文件多模塊相互調用的多個文件調試。
if __name__ == "__main__"語句對於初學者確實稍微有點繞,不過明白了就好了,其實很簡單,自己的一點總結,希望有所幫助:)
Linch Halo:對Python中if __name__ == "__main__"的理解zhuanlan.zhihu.com
想請問一下,在pytorch官網上複製粘貼了圖片分類器的代碼,如下
import torch
import torchvision
import torchvision.transforms as transforms
if __name__ == "__main__": (這段是官網上沒有的,加了之後才能運行)
########################################################################
# The output of torchvision datasets are PILImage images of range [0, 1].
# We transform them to Tensors of normalized range [-1, 1]
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root="./data", train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root="./data", train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = ("plane", "car", "bird", "cat",
"deer", "dog", "frog", "horse", "ship", "truck")
########################################################################
# Let us show some of the training images, for fun.
import matplotlib.pyplot as plt
import numpy as np
# functions to show an image
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(" ".join("%5s" % classes[labels[j]] for j in range(4)))
為什麼必須加斜體加粗的那一段才能運行呢
同樣看了上述所有的回答,感覺多數回答在解釋的時候不知不覺的引入了一些對於新手來說,不太明白的概念(我就是新手,這些在解釋中用到的概念進一步增加了理解的難度).
作為一個新手,我在理解這個知識點的時候,同樣在網上看了很多人寫的解釋,下面這個我覺得是寫的比較好的,用的實例也比較恰當.python編程中的if __name__ == "main": 的作用和原理
感覺這種努力學知識的氛圍很好呀.
推薦閱讀:
※怎樣用 Windows 入門Python?
※Python 有哪些入門學習方法和值得推薦的經典教材?
※如何學習Python,以及新手如何入門?
※學習Python的迷茫,如何高效有趣地學習Python?
※求Python學習路線圖,有沒有大佬給一個?
TAG:Python入門 |