python中的if__name__== "__main__"

防止函数或者类在被导入的时候执行两次,

因为import一个函数的时候,它会把这个函数执行一次。

1、
# vim if__name_0
#_*_coding:utf8_*_
def foo():
    print "in foo"
print  __name__
foo()

# python if__name_0
__main__
in foo

>>> import if__name_0
if__name_0
in foo

# python直接执行if__name_0 和 import if__name_0 后的输出结果不一样,
# 是因为python 直接执行print __name__ 输出的结果是 __main__ , 而import
# 导入执行__name__ 输出的结果是脚本的名字。

2、
# vim if__name_1
#_*_coding:utf8_*_
import if__name_0
if__name_0.foo()

# python if__name_1
if__name_0
in foo
in foo

python执行if__name_1这个脚本后,会先import if__name_0 ,根据上面已经得出的结果,可以知道
import if__name_0 输出的是: 
if__name_0
in foo
然后脚本会再执行函数if__name_0.foo(),输出的结果是:
in foo
所以最终输出的结果是:
if__name_0
in foo
in foo

>>> import if__name_1
if__name
in foo
in foo

3、
# vim if__name_2
#_*_coding:utf8_*_
def foo():
    print "in foo"
print __name__
if __name__ == "__main__":
    foo()

# python if__name_2
__main__
in foo
python执行脚本的时候,print __name__输出的结果是__main__ , __name__ == "__main__" ,
所以继续执行下面的函数,输出: in foo , 所以最终输出结果为 :
__main__
in foo

>>> import if__name_2
if__name_2
import if__name_2的时候,print __name__ = if__name2 ,不等于__main__ , 所以后面的函数就
不执行了,最终输出的结果是if__name_2


4、
# vim if__name_3
#_*_coding:utf8_*_
import if__name_2
if__name_2.foo()

# python if__name_3
if_name_2
in foo
import if__name_2 根据上面得出的结果,import if__name_2输出的是:if__name_2
函数if__name_2.foo()输出的结果是:in foo , 所以最终输出的结果是:
if_name_2
in foo

>>> import if__name_3
if__name_2
in foo


小结: 

python 直接执行print __name__ 输出的结果是 __main__

import 导入一个函数,print __name__输出的是这个函数的脚本的名字

for example:

小明.py  

朋友眼中你是小明(__name__ == "小明"),

你自己眼中的你是你自己(__name__ == "__main__")

朋友去调你去帮他写程序(import 小明,这时你在朋友眼中:__name__ == '小明')

小明自己写程序,直接运行小明.py,__name__ == "__main__"