网站首页 > 技术文章 正文
我们在编写python程序或看别人python代码的时候,经常会看到这句“if__name__==__main__”,它到底有什么作用,怎么用,什么时候用?勇哥就通过这篇文章来帮助大家搞懂这些疑问。
1、首先我们要明白一点,python程序不同于C和C++语言,不需要main()函数作为主程序入口。python中一个模块中的 程序是从上往下执行的,一个python源码文件就是一个模块,如下图所示,cc.py就是一个模块。
2、python中使用的变量分为预定义变量和自定义变量,预定义变量是python本身内部提前定义好的,多用下划线开头以下划线结束来表示。比如__name__,__file__就是一个预定义变量。其实__name__是python预定义的全局变量,在模块内部用来表示模块名称的,如果模块是被导入的,则__name__的值就是模块的名称,如果模块被直接执行,则__name__的值则为__main__ 如下图所示。
我们平时编写的模块要么直接自己调用自己来运行,要么被别人调用来运行。一般来说大部分模块都是被导入,被别人调用来执行,也就是说被别人集成,充当别人的“配件“。
3、综合上述,我们知道所有的模块都是有能力来执行代码的,也就是说, 那些没有缩进的代码行在模块被导入时就会被执行, 不管是不是真的需要执行。如果你不希望某些代码被导入时执行,可以使用if__name__==”__main__”:加以保护。
假如 cc模块中的代码如下图所示,我在创建一个mytest模块,我的意图是在mytest模块中通过导入cc模块中的add函数来使用。
当我在mytest中只写了一条导入语句,然后运行mytest模块,发现cc模块中的第4行语句自动执行了,这个显然不是我想要的,如下图所示。
如果解决这个问题那?我们可以把导入时不希望运行的语句或测试cc模块本身的语句放到if __name__==”__main__”所属的语句里就可以了。我把cc模块中的代码改为如下图所示,这样就解决上述问题,即使你调用add函数也不存在问题了。
为什么这样就不会自动执行那,是因为当一个模块被别的模块导入时,它的名字就是它真实的名字比如cc,不在是__main__。所以cc模块中的if __name==”__main__”下面的语句就不会自动执行。通常我们会把测试本模块的代码放到它的下边,这样做的好处是既可以满足测试本模块代码的功能,也可以在被别人导入时,测试代码不会被自动执行。
我是码农阿勇,喜欢的话,关注我们,你的认可是我们最大的努力方向,感谢小伙伴们一如既往的支持我们,期待留下宝贵建议。
猜你喜欢
- 2024-11-20 python 代码中 __main__ 有什么用途?
- 2024-11-20 看完文章让你读懂if __name__=='__main__'的含义,面试不用愁
- 2024-11-20 一个实例理解Python中的if __name__ ==“__main__”
- 2024-11-20 Python if __name__ 的作用介绍
- 2024-11-20 Python基础--Python中的main、__name__ == "__main__"
- 2024-11-20 Python中的 if __name__ == "__main__"作用?
- 2024-11-20 了解 Python 中 if __name__ == "__main__" 的作用
- 2024-11-20 算法金 | Python 中有没有所谓的 main 函数?为什么?
- 2024-11-20 Python 中 if __name__ == '__main__' 的解释
- 2024-11-20 在Python中定义Main函数
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)