1 引言

  在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行。这句代码多余吗?原理又在哪里?本篇博文对此进行总结说明。

2 程序入口

学过Java、C、C++的程序员应该都知道,每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main函数。如下所示, main()就是Java中的一个main函数。

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("HelloWorld");

    }

}    

  与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。在某种意义上讲,“if __name__==’__main__:”也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if __name__==’__main__:”这条代码的意义之一。

3 模块导入

我们知道,当我们把模块A中的代码在模块B中进行import A时,只要B模块代码运行到该import语句,模块A的代码会被执行。

  模块A:

# 模块A

a = 100

print('你好,我是模块A……')

print(a)

  模块B:

# 模块B

from package01 import A

b = 200

print('你好,我是模块B……')

print(b)

  运行模块B时,输出结果如下:

  你好,我是模块A……

  100

  你好,我是模块B……

  200

  如果在模块A中,我们有部分的代码不想在被导入到B时直接被运行,但在直接运行A时可直接运行,那该怎么做呢?那就可以用到“if __name__==’__main__:”这行代码了,我们队上面用到的A模块代码进行修改:

  A模块代码修改为:

# 模块A

a = 100

print('你好,我是模块A……')

if __name__=='__main__':

    print(a)

  B模块不做修改,直接执行B模块,输出结果如下:

  你好,我是模块A……

  你好,我是模块B……

  200

  看到了吗,A模块中的a的值就没有再被输出了。所以,当你要导入某个模块,但又不想改模块的部分代码被直接执行,那就可以这一部分代码放在“if __name__=='__main__':”内部。

4 “__name__”与“__main__”

看到现在也许心中还是疑惑,为什么会这样,那么现在我们来说一说“if __name__=='__main__':”的原理。

“__name__”是Python的内置变量,用于指代当前模块。我们修改上面用到的A模块和B模块,在模块中分别输出模块的名称:

  模块A:

# 模块A

print('你好,我是模块A……')

print('模块A中__name__的值:{}'.format(__name__))

print('-------------------------')

  模块B:

# 模块B

from package01 import A

print('你好,我是模块B……')

print('模块B中__name__的值:{}'.format(__name__))

  执行A模块时,输出结果:

  你好,我是模块A……

  模块A中__name__的值:__main__

  -------------------------

  执行B模块时,输出结果:

  你好,我是模块A……

  模块A中__name__的值:package01.A

  -------------------------

  你好,我是模块B……

  模块B中__name__的值:__main__

  发现神奇之处了吗?当哪个模块被直接执行时,该模块“__name__”的值就是“__main__”,当被导入另一模块时,“__name__”的值就是模块的真实名称。用一个类比来解释一下:记得小时候要轮流打算教室,轮到自己的时候(模块被直接执行的时候),我们会说今天是“我”(__main__)值日,称呼其他人时,我们就会直接喊他们的名字。所以,“__main__”就相当于当事人,或者说第一人称的“我”。

  所以,当运行“if __name__=='__main__':”语句时,如果当前模块时被直接执行,__name__的值就是__main__,条件判断的结果为True,“if __name__=='__main__':”下面的代码块就会被执行。

5 总结

“if __name__=='__main__':”语句的用处与原理大概也讲清楚了,如果没说明白,或者是我没理解到位,请给我留言。另外多说一句,“if __name__=='__main__':”很多时候看似无用,但是,出于代码的规范性,还是有必要的。

Python中“if __name__=='__main__':”理解与总结的更多相关文章

  1. Python中if __name__ == '__main__':理解

    在很多python脚本中在最后的部分会执行一个判断语句if __name__ == "__main__:",之后还可能会有一些执行语句.那添加这个判断的目的何在? 在python编 ...

  2. python 中if __name__ = '__main__' 的作用

    python 中if __name__ = '__main__' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 __name__. 一个模块的 ...

  3. FAQ: Python中if __name__ == '__main__':作用

    #hello.pydef sayHello(): str="hello" print(str); if __name__ == "__main__": prin ...

  4. Python中if __name__ == '__main__':作用

    #hello.pydef sayHello(): str="hello" print(str); if__name__=="__main__": print ( ...

  5. 对python中的__name__的理解

    一开始学习python的时候,不理解python中的__name__的用途,一致感觉__name__的返回结果就是__main__ 今天系统的看了一下,才理解过来,__name__真正的用处是用在使用 ...

  6. python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ ==  '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一 ...

  7. python中if __name__ == '__main__'

    python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: “Make a script both importable and execut ...

  8. python基础之python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...

  9. python中if __name__ == '__main__': 解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ ==  '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一 ...

随机推荐

  1. Python之文件与目录操作(os、zipfile、tarfile、shutil)

    Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读取或写入 os.path模块 文件路径操作 os模块 文件和目录简单操作 zipfile模 ...

  2. Redis缓存与springboot集成

    注意点:

  3. JeeSite 4.x 树形结构的表设计和用法

    有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章. 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理 ...

  4. Linux命令(三)远程登录

  5. github 远程仓库

    因为本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以设置一下 第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_r ...

  6. Gnucash数据库结构

  7. BZOJ4818 序列计数

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...

  8. 20155306 2016-2017-2 《Java程序设计》第八周学习总结

    20155306 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 java.util.loggging包提供了日志功能相 ...

  9. iOS编码规范参考

    目录      注释 1.1  多行注释 1.2  单行注释 1.3  函数的注释   命名 2.1  常量的命名 2.2  函数的命名 2.3  变量的命名 2.3.1  成员变量 2.3.2  公 ...

  10. 关于升级程序版本时version与build修改的问题

    CHENYILONG Blog 关于升级程序版本时version与build修改的问题 #问题#从V1.0升级到V1.0.1.version是一定要改的,那么build需要修改吗? #解答#一般习惯上 ...