標籤:

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入門 |