对于if name == ‘main’:这行代码,刚开始写python时,始终容易忘记他的用法。
其实如果你写过java或者C语言,你会发现在java或者C语言中最开始都会写一个main()函数,
java:
public static void main(String args[ ])
C:
int main()
他们的都有一个共同的作用,就是作为程序入口,也就是说,程序的运行会从main()函数开始,在main函数之前的代码如果不在mian内进行调用,则不会被运行
而python不一样,java、C都是编译型语言,python则是解释型语言。当你编写Python代码时,一个.py文件,会从第一行开始就动态的逐行进行解释,没有一个统一的入口。
我们知道,一个.py文件除了可以被直接运行外,还可以作为模块(库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行。而当一个.py文件作为模块被导入时,我们可能希望一部分代码不被运行。例:
创建一个data.py文件
a=1
b=1
def data():
print(a,b)
data()
data函数会打印a,b的值
然后创建一个add.py文件,在此文件中引入data.py文件
import data
def add():
return data.a+data.b
print(add())
add函数使用了data的a,b的值,此时运行add函数,打印如下:
不仅打印了a+b的值,还打印了a,b的值,但是如果我们不希望a,b的值被打印,要怎么办呢?
在data函数前加一个if name == ‘main’:即可,例:
a=1
b=1
def data():
print(a,b)
if __name__ == '__main__':
data()
此时我们再去运行add.py,结果如下:
没有打印a,b的值了。
原理解析:
name__属于python的内置类,代表对于程序的名称,如果当前运行的程序是主程序,name__的值就是__main,例如你运行data文件时,data就是主程序,打印__name__的值就是__main。
我们在data中加入
print(name)
return name
再运行data.py
a=1
b=1
def data():
print(a,b)
print(__name__)
return __name__
if __name__ == '__main__':
data()
输出结果为:
说明data文件的__name__为__main__。
将add文件中return data.a+data.b改为:return data.a+data.b,data.name
这时再去运行add.py,结果为:
当我们在add文件中运行时,data不是主程序了,add.py才是主程序,所以这时,data的__name__的值为模块名
所以当我们运行add.py时,if name == ‘main’:后面的代码就不会被运行了,因为在add.py中,data的__name__ != ‘main’