相信大家在看别人的python程序时,可能会在大部分的程序后看到标题这段代码,这里解释下它的意义。总的来说,这句代码的作用就是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入。

下面我将通过几个例子帮助大家理解

demo1.py

  

# encoding=utf-8
# -*- coding: UTF-8 -*- # print(__name__)

输出结果:

查看类型:

这说明__name__本身其实就是一个变量,不过比较特殊。

实际上,它是在程序执行前就被创建并赋值的,而赋值的机制是这里的关键。

在当前程序被当作主程序运行时, __ name__被自动赋值为固定的字符串__main__;

当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名。

对于以下demo2.py代码:

def printhello():
print("Hello World")
print(__name__) if __name__ == '__main__':
printhello()

输出的结果为:

Hello World

__main__

因为此时上述代码没有在其他程序中作为模块导入,而是直接执行的,所以 __name__变量被赋值为"__main__"   ;

其实上述带有if判断的代码和下述demo_f.py 代码执行结果相同:

def printhello():
print("Hello World")
print(__name__) printhello()

可见这句if判断代码的作用就是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入。所以它也可以在当前文件被当作一个模块导入时发挥关键作用。

但当其不要判断语句且它被作为模块导入时,输出的结果可能就与大家想的有点偏差了。

from demo_f import printhello

printhello()

程序执行输出的结果为:

Hello World
demo_f
Hello World
demo_f

首先,可以看到p_l.py在被作为模块调入时,对应的__name__被赋值为对应的文件名

虽然只运行了一遍demo_f.py文件,但我们可以发现函数执行了两次

这是因为,不带判断语句的demo_f.py文件作为模块被引入时,printhello函数已经自动执行了一次,之后在4.py被主动调用时执行了一次,所以一共执行两次。
那么,此带if判断的代码的作用已经十分清楚了,它保证模块文件的函数既能在模块文件单独执行,又能保证它被其它.py文件导入时,相应的函数不会执行两次。

————————(我是分割线)————————

参考:

1. https://blog.csdn.net/forever_wen/article/details/84787021

备注:

初次编辑时间:2019年10月5日14:25:15

环境:Windows 7   / Python 3.7.2

【Python】if __name__ == '__main__' 含义解析的更多相关文章

  1. 对于python的__name__="__main__"的含义的理解

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

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

    引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

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

    原文链接:http://www.jb51.net/article/51892.htm 举例说明解释的非常清楚,应该是看到的类似博文里面最简单的一篇: 这篇文章主要介绍了python 中__name__ ...

  4. 002_浅析python 中__name__ = '__main__' 的作用

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

  5. 理解 python 中__name__ = '__main__' 的作用

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

  6. python的__name__ == \'__main__\' 意义

    转自http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

  7. 【Python中if __name__ == '__main__': 的解析】

    在很多Python代码中,在代码的最下方会看到  if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.p ...

  8. Python常见经典 python中if __name__ == '__main__': 的解析

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

  9. Python if __name__ == "__main__" 的含义

    一.概念 我们在Python中经常可以看到一个程序会有if __name__ == "__main__",同时这通常是写在程序的入口位置,那么他有什么特殊含义呢?在了解这个之前,我 ...

随机推荐

  1. 分布式hadoop 架构图

    zk:zookeeper NN:namenode DN:datanode ZF Failover Controller:简称zkfc ,是zk的客户端,只运行在主备的namenode上,主要作用是判断 ...

  2. BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心

    Code: #include <queue> #include <cstdio> #include <cstring> #include <algorithm ...

  3. 【csp模拟赛5】加减法--宽搜维护联通快

    题目大意: 一开始想用并查集,发现很难维护联通块的代表元素,所以用了宽搜,开数组会炸,所以开一个优先队列维护,每扫完一个联通块,统计答案,清空优先队列,!!千万记住注意数组的大小!!! 代码: #in ...

  4. Leading and Trailing(LightOJ - 1282)

    题解:求一个数的次幂,然后输出前三位和后三位,后三位注意有前导0的情况. 后三位直接用快速幂取模求解. 前三位求得时候只需要稍微变形一下,可以把乘过的结果拆成用科学计数法,那么小数部分只有由前面决定, ...

  5. 快速掌握Python的捷径-Python基础前传(1)

    文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事. 方丈高楼平地起,无论 ...

  6. jenkins+Maven从SVN上构建项目

    一.安装Maven 下载地址:https://maven.apache.org/download.cgi 把下载的安装包解压 tar -xvf apache-maven--bin.tar.gz 配置环 ...

  7. Lua unpack函数用法

    unpack,接受一个table做个参数,然后按照下标返回数组的所有元素 unpack lua 版本 <= 5.1 local t = {nil , 3} retunrn unpack(t) / ...

  8. myeclipse使用SVN分支与合并详解

    此博文主要内容来源地址:https://blog.csdn.net/liuyifeng1920/article/details/53118183,感谢原创博主: 先介绍一下svn的两种开发和发布的规范 ...

  9. Dubbo API 笔记——Dubbo架构与使用

    转载于: https://blog.csdn.net/benhuo931115/article/details/78457149 架构演变 单一应用架构 所有功能部署在一个应用上,用于简化增删改查工作 ...

  10. IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(一)

    新人接触springboot,IDE使用的是IntelliJ IDEA 2017.3 ,自己摸索了很久,现在自己整理一下,里面有些操作我自己也不懂是为什么这样,只是模仿公司现有的项目,自己搭建了一个简 ...