Fork me on GitHub

python 中__name__ = '__main__' 的作用

    python的初学者经常会问这样的问题:为什么python官方模块或其他第三方模块中,代码结尾都这样一句代码

if __name__ == "__main__"
 
这句代码是干什么用的呢,为什么要这么写呢。
 
网上最常见的解释就是“Make a script both importable and executable”,意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。这句话不好理解,也没有回答为什么要这样写,不这样写会有什么后果。下面举例子来说明。
 
#nametest.py
def test():
  print "we are in %s"%__name__
if __name__ == '__main__':
  test()
 
直接运行这段代码的时候,会发现结果是打印出“we are in __main__”,说明我们的if语句中的内容被执行了,并且调用了test()。
再看下一个例子。
 
#nametest2.py
from nametest import test
test()
 
运行结果是:“we are in nametest”。也就是说,test函数执行了,但nametest.py模块下的if语句并没有执行。因为此时__name__变量为模块名称nametest。
 
再来看另外一种情况。如果我们不写“if __name__ == '__main__'” 这句,而是直接在模块末尾执行test()函数
 
#nametest.py
def test():
  print "we are in %s"%__name__
test()
 
直接运行的时候,仍然会打印出“we are in __main__”,很明显,test()执行了。如果我们在其他模块中导入此模块,情况会怎样呢?
 
#nametest2.py
from nametest import test
test()
 
我们会发现,打印出了两行“we are in nametest”。原因在于,模块nametest2在import test的时候,test()执行了一次,该模块中test()又执行了一次。
因此,为了使模块中的函数可以单独执行,又为了避免在导入的同时直接执行。需要加上“if __name__ == '__main__'”语句,并且把需要在单独运行该模块时就要执行的函数(比如模块的测试语句,等等)写在此语句内,这样可以使该模块被其他模块导入时,函数不会执行2次。
(完)
posted @ 2017-07-30 16:17  赵小生z  阅读(620)  评论(0编辑  收藏  举报