相信大家在看别人的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. 【csp模拟赛2】黑莲花--数据结构+数论

    没有什么能够阻挡,你对被阿的向往.天天 AK 的生涯,你的心了无牵挂. 虐过大佬的比赛,也曾装弱装逼.当你低头的瞬间,才发现旁边的人. 把你的四肢抬起来,使劲地往门上撞.盛开着永不凋零,黑莲花. —— ...

  2. conda 激活环境失败解决办法

    https://stackoverflow.com/questions/41746137/conda-environment-is-discoverable-but-not-activateable- ...

  3. Django基础之Session

    1. Session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的 ...

  4. 记一次springboot+mybatis+phoenix在代码集成中的坑

    场景: 希望使用phoenix做查询服务,给服务端提供接口 设计: 通过springboot做restful的接口发布,通过mybatis做phoenix的sql处理,因此是springboot+my ...

  5. OSX 改变PHP安装路径环境变量

    当使用XAMPP来学习Laravel的时候,用composer安装laravel总是报错,说mcrypt is required ,但是当我在终端里打印 which php 显示的是usr/bin/p ...

  6. 提交本地文件至gitlab已有的项目中(更新gitlab)

    gitlab代码更新 gitlab官网 1.安装git git官网 官网下载安装,安装过程一直next即可(路径自己选) 2.clone至本机 格式:git clone url(可转到指定目录克隆) ...

  7. 深度解析 Qt 中动态链接库

    本文介绍的是Qt 中动态链接库,现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库,MFC好象也有类似机制,Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库. ...

  8. docker内时间问题

    修改配置文件来修改时区1.修改/etc/sysconfig/clock         ZONE=Asia/Shanghai 2.rm /etc/localtime 3.链接到上海时区文件       ...

  9. [go]结构体/接口

    接口惯用操作: 结构体构造方法返回接口类型 //定义服务器接口 type IServer interface{ Start() Stop() Serve() } type Server struct ...

  10. 如何应对POST方式下载文件的接口

    jQuery的下载,需要承载一个插件去做 今天遇到一个问题,后台给的接口由于需要前端传入过多的参数,只能接受用post去下载文件.正常情况下第一反应是用xhr对象去发送post请求,结果并没有触发浏览 ...