【Python学习笔记】 if __name__ == ‘__main__‘ 如何正确理解?

2023-05-16

引言

学过Java、C、C++的程序员应该都知道,每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main函数。如下所示, main()就是Java中的一个main函数。

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("HelloWorld");

    }

}

与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。在某种意义上讲,“if namemain:”也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if namemain:”这条代码的意义之一。

1. __name__的理解

1.1 为什么使用__name__属性?

Python解释器在导入模块时,会将模块中没有缩进的代码全部执行一遍(模块就是一个独立的Python文件)。开发人员通常会在模块下方增加一些测试代码,为了避免这些测试代码在模块被导入后执行,可以利用__name__属性。

1.2 __name__属性。

__name__属性是Python的一个内置属性,记录了一个字符串。

  • 若是在当前文件,name 是__main__。

    • 在hello文件中打印本文件的__name__属性值,显示的是__main__

img

  • 若是导入的文件,__name__是模块名。

    • test文件导入hello模块,在test文件中打印出hello模块的__name__属性值,显示的是hello模块的模块名。

img

因此__name__ == ‘main’ 就表示在当前文件中,可以在if name == ‘main’:条件下写入测试代码,如此可以避免测试代码在模块被导入后执行。

2. 模块导入

我们知道,当我们把模块A中的代码在模块B中进行import A时,只要B模块代码运行到该import语句,模块A的代码会被执行。

模块A:

# 模块A

a = 100

print('你好,我是模块A……')

print(a)

模块B:

# 模块B

from package01 import A

b = 200

print('你好,我是模块B……')

print(b)

运行模块B时,输出结果如下:

你好,我是模块A……
100
你好,我是模块B……
200

如果在模块A中,我们有部分的代码不想在被导入到B时直接被运行,但在直接运行A时可直接运行,那该怎么做呢?那就可以用到“if name==’main:”这行代码了,我们队上面用到的A模块代码进行修改:

A模块代码修改为:

# 模块A

a = 100

print('你好,我是模块A……')

if __name__=='__main__':

    print(a)

B模块不做修改,直接执行B模块,输出结果如下:

你好,我是模块A……
你好,我是模块B……
200

看到了吗,A模块中的a的值就没有再被输出了。所以,当你要导入某个模块,但又不想改模块的部分代码被直接执行,那就可以这一部分代码放在“if name==‘main’:”内部。

3. “name”与“main

看到现在也许心中还是疑惑,那么现在我们来说一说“if__name__==‘main’:”的原理。

name”是Python的内置变量,用于指代当前模块。我们修改上面用到的A模块和B模块,在模块中分别输出模块的名称:

模块A:

# 模块A

print('你好,我是模块A……')

print('模块A中__name__的值:{}'.format(__name__))

print('-------------------------')

模块B:

# 模块B

from package01 import A

print('你好,我是模块B……')

print('模块B中__name__的值:{}'.format(__name__))

执行A模块时,输出结果:

你好,我是模块A……
模块A中__name__的值:__main__
-------------------------

执行B模块时,输出结果:

你好,我是模块A……
模块A中__name__的值:package01.A
-------------------------
你好,我是模块B……
模块B中__name__的值:__main__

发现神奇之处了吗?当哪个模块被直接执行时,该模块“name”的值就是“main”,当被导入另一模块时,“name”的值就是模块的真实名称。用一个类比来解释一下:记得小时候要轮流打算教室,轮到自己的时候(模块被直接执行的时候),我们会说今天是“我”(main)值日,称呼其他人时,我们就会直接喊他们的名字。所以,“main”就相当于当事人,或者说第一人称的“我”。

所以,当运行“if namemain’:”语句时,如果当前模块时被直接执行,name__的值就是__main,条件判断的结果为True,“if namemain’:”下面的代码块就会被执行。


https://www.zhihu.com/question/49136398

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python学习笔记】 if __name__ == ‘__main__‘ 如何正确理解? 的相关文章

  • 【每天一个 Linux 命令】linux下几种运行后台任务的方法

    1 问题的引入 程序员最不能容忍的是在使用终端的时候往往因为网络 xff0c 关闭屏幕 xff0c 执行CTRL 43 C等原因造成ssh断开造成正在运行程序退出 xff0c 使得我们的工作功亏一篑 其背后的主要原因在于上述的相关操作 xf
  • 【每天一个 Linux 命令】tree命令

    1 前言 本文主要讲解Linux系统上的tree命令的详细使用方法 tree 命令是一个小型的跨平台命令行程序 xff0c 用于递归地以树状格式列出或显示目录的内容 它输出每个子目录中的目录路径和文件 xff0c 以及子目录和文件总数的摘要
  • 【每天一个 Linux 命令】wget 命令用法详解

    Linux wget是一个下载文件的工具 xff0c 它用在命令行下 对于Linux用户是必不可少的工具 xff0c 尤其对于网络管理员 xff0c 经常要下载一些软件或从远程服务器恢复备份到本地服务器 如果我们使用虚拟主机 xff0c 处
  • 【每天一个 Linux 命令】Linux命令ls和cp

    ls xff08 英文全拼 xff1a list files xff09 命令用于显示文件目录列表 xff0c 和Windows系统下DOS命令dir类似 当执行ls命令时 xff0c 默认显示的只有非隐藏文件的文件名 以文件名进行排序及文
  • 【每天一个 Linux 命令】Linux命令 mkdir,cat,touch,vi/vim

    文章目录 mkdir命令语法mkdir命令示例cat命令语法cat命令示例touch命令语法touch命令示例vi与vim的区别vi vim 的使用命令模式 xff1a 输入模式底线命令模式 vi vim 使用实例使用 vi vim 进入一
  • 【LeetCode刷题日记】1576. 替换所有的问号

    题目 给你一个仅包含小写英文字母和 39 39 字符的字符串 s xff0c 请你将所有的 39 39 转换为若干小写字母 xff0c 使最终的字符串不包含任何 连续重复 的字符 注意 xff1a 你 不能 修改非 39 39 字符 题目测
  • 【LeetCode刷题日记】71. 简化路径

    题目 给你一个字符串 path xff0c 表示指向某一文件或目录的 Unix 风格 绝对路径 xff08 以 39 39 开头 xff09 xff0c 请你将其转化为更加简洁的规范路径 在 Unix 风格的文件系统中 xff0c 一个点
  • 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解

    文章目录 一 前言1 文件的概念2 文件描述符和文件指针文件描述符文件描述符和文件指针的区别文件描述符太多了怎么办 二 I O多路复用1 I O多路复用的由来不要打电话给我 xff0c 有需要我会打给你I O多路复用 xff0c I O m
  • 【LeetCode刷题日记】1614. 括号的最大嵌套深度

    题目 如果字符串满足以下条件之一 xff0c 则可以称之为 有效括号字符串 xff08 valid parentheses string xff0c 可以简写为 VPS xff09 xff1a 字符串是一个空字符串 34 34 xff0c
  • openwrt 环境下通过3G/4G dongle发送短信

    1 首先openwrt环境中编译gcom工具 2 参考网站 https www xuebuyuan com 1046229 html http dev archive openwrt org ticket 18424 学习到如何通过gcom
  • 【每天一个 Linux 命令】文件目录操作命令大全

    文章目录 cd命令语法cd命令使用示例pwd命令语法pwd命令示例rm命令语法rm命令使用示例mv命令语法mv命令使用示例more命令语法more命令使用示例head命令语法head命令使用示例tail命令语法tail命令使用示例 前面的一
  • 【LeetCode刷题日记】89. 格雷编码

    题目 n 位格雷码序列 是一个由 2n 个整数组成的序列 xff0c 其中 xff1a 每个整数都在范围 0 2n 1 内 xff08 含 0 和 2n 1 xff09 第一个整数是 0 一个整数在序列中出现 不超过一次 每对 相邻 整数的
  • 【每天一个 Linux 命令】Linux文件和目录属性

    文章目录 Linux 目录结构Linux文件类型与扩展名linux文件属性详解 Linux 目录结构 对于每一个Linux学习者来说 xff0c 了解Linux文件系统的目录结构 xff0c 是学好Linux的至关重要的一步 xff0c 深
  • 【每天一个 Linux 命令】文件查找命令总结(which命令、whereis命令、locate命令、find命令)

    文章目录 which命令语法which命令使用示例whereis 命令语法whereis命令使用示例locate 命令语法locate命令使用示例find 命令语法find命令使用示例find命令之exec使用示例find 命令的参数详解
  • 【每天一个 Linux 命令】文件压缩和解压命令:tar命令和gzip命令

    文章目录 tar命令语法tar命令使用示例gzip命令语法gzip命令使用示例 tar命令语法 通过SSH访问服务器 xff0c 难免会要用到压缩 xff0c 解压缩 xff0c 打包 xff0c 解包等 xff0c 这时候tar命令就是是
  • 从程序员的角度,来拆解物联网系统中的开发工作

    文章目录 物联网系统 设备端的开发 1 不需要网关的设备2 需要网关的设备3 WiFi 类设备 物联网平台开发 业务应用开发 推荐一篇好文 xff1a 从程序员的角度 xff0c 来拆解物联网系统中的开发工作 可以结合我之前的一篇文章来看
  • 嵌入式数据库(Embedded Database)

    嵌入式数据库 xff08 Embedded Database xff09 和数据库服务器 xff08 Database Server xff09 像Oracle Sybase MySQL和SQL Server这些大家熟知的数据库都属于数据库
  • 【LeetCode刷题日记】306. 累加数

    题目 累加数 是一个字符串 xff0c 组成它的数字可以形成累加序列 一个有效的 累加序列 必须 至少 包含 3 个数 除了最开始的两个数以外 xff0c 字符串中的其他数都等于它之前两个数相加的和 给你一个只包含数字 39 0 39 39
  • Linux文本处理grep详解

    在 Linux 中 xff0c 文本处理无非是对文本内容做查看 修改等操作 本章将介绍Linux中常用的文本处理命令 xff0c 以及被称为Linux三剑客的 grep sed 和 awk 命令 有读者可能会问 xff0c 处理文本内容 x
  • Linux Shell基础教程

    文章目录 Shell简介 xff1a 1分钟理解什么是ShellShell 是一种脚本语言 Shell对于运维人员的重要性Shell Python 和 Perl1 Perl 语言2 Python 语言3 Shell 几种常见的Shell x

随机推荐