相信大家在看别人的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

最新文章

  1. goEasy消息推送,pushlet 向特写用户实时推送
  2. windows多线程相关
  3. 字符串复制char *strcpy(char* dest, const char *src);
  4. LintCode "Coins in a Line II" !
  5. 图说Java —— 理解Java机制最受欢迎的8幅图
  6. JSON和JAVA的POJO的相互转换【转载】
  7. [Locked] Binary Tree Longest Consecutive Sequence
  8. jsp DAO设计模式
  9. Docker 生成Node.js web app(含端口映射)
  10. VBA基础知识———常用语句
  11. HTTPS介绍
  12. .net core下使用Thrift
  13. vue项目中使用插件将字符串装化为格式化的json数据(可伸缩)
  14. vue---mint-ui组件loadmore(上拉加载,下拉刷新)
  15. JSP页面用<a>标签访问 Action 出错
  16. 安卓开发学习之AutoCompleteTextView
  17. 利用nginx添加账号密码验证
  18. ECSHOP广告调用广告位添加到首页顶部通栏教程
  19. with check(转)
  20. POJ1195--Mobile phones(基础二维BIT)

热门文章

  1. Win10 下载 masmplus
  2. Python爬虫 Urllib库的基本使用
  3. Linux 网络通信命令之 netstat
  4. Maven项目导出jar包,包含依赖
  5. PDB GDB 调试代码
  6. react-redux学习初步总结
  7. Flume-概述
  8. Kotlin中单例Singleton模式
  9. python之scrapy爬取数据保存到mysql数据库
  10. vue+npm+Element插件+路由