网站首页 > 技术文章 正文
我们在编写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函数
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)