__name__ == '__main__'到底是什么意思

相信许多人初学 Python 时,常会在例子程序中看到如下语句:

if __name__ == '__main__':foo()  # 或其他语句

第 1 行的__name__ == '__main__'到底是什么意思呢?

首先,如果你永远都只执行一个 xxx.py,而不去 import它的话,那你完全不需要了解这是什么。例如你写了一个程序,文件名叫 hello.py

print("====this is hello.py====")
def foo():print("hello")
print("call foo() which is defined here")
foo()
print("====this is hello.py END ====")

然后你总是直接执行它,就像这样

$ python3 hello.py
====this is hello.py====
call foo() which is defined here
hello
====this is hello.py END ====

这完全没有问题。

但是,当别人想引用你的foo()函数时,就有问题了。

例如别人写了一个文件,名字是 world.py

# world.py
print("====this is world.py====")
from hello import fooprint("call foo() which is defined in other file")
foo()
print("====this is world.py END ====")

运行结果如下:

$ python3 world.py
====this is world.py====
====this is hello.py====
call foo() which is defined here
hello
====this is hello.py END ====
call foo() which is defined in other file
hello
====this is world.py END ====

可以看到,解释器是逐行解释源码的,当执行到源码的第 3 行时,也就是 hello.py 被引用时,hello.py 的每一行都会被解释器读取并执行,执行效果就是结果中的3~6行,然后解释器执行源码的5~7行。

如果你不想要结果中的3~6行,该怎么做呢?

Python 解释器执行代码时,有一些内建、隐含的变量,__name__就是其中之一,其意义是“模块名称”。

如果该模块是被引用,那么__name__的值会是此模块的名称;如果该模块是直接被执行,那么__name__的值是__main__

或许你还不明白,那我们来做个实验。

# hello.py
print("====this is hello.py====")
print(__name__)
def foo():print("Ha")
print("call foo() which is defined here")
foo()
print("====this is hello.py END ====")

请注意上面第3行

# world.py
print("====this is world.py====")
print(__name__)
from hello import foo
print("call foo() which is defined in other file")
foo()
print("====this is world.py END ====")

同样,请注意上面第3行

我们看一下运行结果。

对于第一个:

$ python3 hello.py
====this is hello.py====
__main__
call foo() which is defined here
Ha
====this is hello.py END ====

从结果的第3行可以看出,对于直接运行的模块,其模块名是 __main__

对于第二个:

$ python3 world.py
====this is world.py====
__main__    # 因为 world.py 被直接执行,所以这里的值是 __main__
====this is hello.py====
hello       # 因为 hello.py 被引用,所以这里的值是 hello
call foo() which is defined here
Ha
====this is hello.py END ====
call foo() which is defined in other file
Ha
====this is world.py END ====

注意到第5行了吗?这里的“hello”正是 hello.py 被引用时的模块名称。

由此可见,__name__的值在模块被直接执行时与被引用时是不同的。

回到上面的问题:当一个模块被引用时,如何不执行该模块的语句?答案就是靠判断__name__是否等于 __main__。当一个模块被直接执行时,其__name__必然等于__main__;当一个模块被引用时,其__name__必然等于文件名(不含.py);

总结

之所以常看见这样的写法,是因为该程序可能有“单独执行”(例如执行一些单元测试)与“被引用”两种情况,鉴于这两种情况中__name__的值是不同的:当一个模块被直接执行时,其__name__必然等于__main__;当一个模块被引用时,其__name__必然等于文件名(不含.py)。所以利用判断__name__ == '__main__'的真假就可以将这两种情况区分出来。

参考资料

http://blog.castman.net/教學/2018/01/27/python-name-main.html

__name__ == '__main__' 到底是什么意思相关推荐

  1. Python中的 if __name__ == __main__到底是个啥意思?

    对于Python初学者来说,在看别人代码时经常会看到if __name__ == "__main__",这时心里就开始吐槽:"绝对又是装逼,我特么不写这句话,代码不照样跑 ...

  2. Python | 别人家的代码 if __name__ == '__main__' 到底什么意思?

    相信刚接触Python的你一定有过如此经历,把所有的代码都写在 if __name__ == '__main__' 下,因为有人告诉你,这样比较符合 Pythonista 的代码风格. 殊不知这段代码 ...

  3. 浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

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

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

  5. Python的if __name__ == ‘__main__‘:的作用

    程序入口 对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等.如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要 ...

  6. python 中__name__ = '__main__' 的作用

    学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main ...

  7. 2020-12-11 Python中的 if __name__ == “__main__“

    Python中的 if __name__ == "__main__" 对于Python初学者来说,在看别人代码时经常会看到if __name__ == "__main__ ...

  8. __name__=='__main__'的理解和使用

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

  9. 如何快速简单粗暴地理解Python中的if __name__ == ‘__main__‘

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

最新文章

  1. 线程同步——内核对象实现线程同步——等待函数
  2. 风讯dotNETCMS源码分析—数据存取篇
  3. Codeforces Round #712 (Div. 2) F. Flip the Cards 思维 + 贪心
  4. 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准
  5. (BFS)Meteor Shower (poj3669)
  6. C++17特性一览(转载)
  7. java表格选中事件_表格中删除选中的操作
  8. 机器学习防止模型过拟合的方法知识汇总
  9. 虎年全新姓氏头像制作多模板微信小程序2022新版头像制作源码支持多种流量主模式亲测
  10. 大数开根 高精度 平方根
  11. 动态规划问题 -- 求给定K个币种时N美元有几种组合方式 (例1,2,3美元存在,求10美元有几种组合方式)
  12. Dreamweaver CS6 新建站点
  13. 企业群发短信时为什么要找短信平台公司而不是直接找运营商发送
  14. simulink子模块上插入图片
  15. 苹果笔记本电脑运行win系统时温度过高解决办法
  16. Java后台开发面试实战(四):设计模式
  17. IIS6.0架构(续)
  18. 某位死磕成都的程序员面试总结,字节+OPPO+研究所+国企,应该选择国企吗?
  19. FTP工作原理及内网用端口映射方式建FTP的注意事项
  20. 访问学者美国访学行前需了解的常识?

热门文章

  1. hdu-2199 Can you solve this equation?(二分+精度)
  2. NYOJ 661 亲亲串
  3. struts2 集成webservice 的方法
  4. CString类型的头文件、CString的输出、CString的常用用法
  5. 自然语言处理笔记4-哈工大 关毅
  6. 基本操作:win10系统磁盘分区
  7. 英语写作中常见语法总结(一)
  8. CUDA从入门到精通(四):加深对设备的认识
  9. 如何在CentOS 7 / RHEL 7 运行单用户模式进行root的密码重置
  10. 【笔记】基于 Mask R-CNN 的玉米田间杂草检测方法