Python技能树答疑:if __name__=="__main__": 的作用

幻灰龙 2023-02-26 21:06:42

Python 技能树的所有 Python 代码,都含有下面这行代码:

if __name__=="__main__":

例如:

if __name__=="__main__":
  print("Hello, World")

这行代码的作用是什么呢?这里给出明确的解释:

在 Python 中,每个模块都有一个名称,该名称存储在全局变量 __name__ 中。

  1. 当使用python a.py运行模块时,Python解释器会a.py所在的模块名称__name__指定为 "__main__"
  2. 当使用python b.py,并且在b.py里面含有import a这样的将a.py导入,那么a.py所在的模块名称__name__则为a

这意味着:

可以通过检查 __name__ 变量来确定模块是作为程序的入口点运行还是作为库导入到其他模块中。

例如,如果有两个python文件a.py,b.py 代码分别是:

a.py:

def add(a, b):
    return a + b


print("a.py模块的__name__变量是:", __name__)

if __name__ == "__main__":
    print("a.py是程序主入口")

b.py

import a

print("b.py模块的__name__变量是:", __name__)

if __name__ == "__main__":
    print("b.py是程序主入口")
    print(a.add(1, 2))

现在,我们分别实验下:

执行python a.py,输出:

a.py模块的__name__变量是: __main__
a.py是程序主入口

执行python b.py,则分别输出:

a.py模块的__name__变量是: a
b.py模块的__name__变量是: __main__
b.py是程序主入口
3

因此,if __name__=="__main__": 的作用是

  1. 在程序作为主模块运行时执行一些特定代码
  2. 而在程序被导入为模块时不执行这些代码。

通常在这个条件下编写的代码用于:

  1. 测试模块,例如在上面的a.py,可以被b.py导入使用,但是你也可以直接执行python a.pya.py在它自己的if __name__ == "__main__":代码块下执行一些测试代码。
  2. 或者执行模块的初始化操作。

--end--

...全文
11771 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻灰龙 2023-02-28
精选
  • 打赏
  • 举报
回复
10.00元
11

持续学习

幻灰龙 2023-02-26
精选
  • 打赏
  • 举报
回复 12

那么:下一个问题是,Python允许全局执行代码,为什么Python技能树的所有程序主入口代码都一定要加上这行呢?这是因为,这样写代码:

  1. 代码更清晰,程序的主入口更清晰。
  2. 从一开始就不鼓励写「全局代码」,在工程上,全局代码容易导致代码之间的耦合。会影响后续程序的可维护性。
phyfance 2024-10-16
  • 打赏
  • 举报
回复
导入a.py后执行b.py,为什么第一个输出的是 a.py模块的__name__变量是:a
零零发不玩ai 2024-07-09
  • 打赏
  • 举报
回复
其实就是用于测试当前模块的方法
马到成功875 2024-06-16
  • 打赏
  • 举报
回复
好像全都是理论,我都看不懂,
哲星朵 2024-02-17
  • 打赏
  • 举报
回复
_main_ 中的短横线是什么意思@CSDN-Adn助手
2401_86077053 2024-07-01
  • 举报
回复
@哲星朵 可能是间隔吧
2301_80654796 2023-12-01
  • 打赏
  • 举报
回复
是不是说if __name__=="__main__:是用来检测是否有b模块调用a模块的程序如果有__main__会变成a 还有就是在程序树里面都有这个 没有这个if语句的话也能正常运行
不鉴 2023-10-16
  • 打赏
  • 举报
回复
还看不懂,码下学到模块再看
m0_70361853 2023-08-18
  • 打赏
  • 举报
回复 1
楼主大人,请教个问题,这个输出为什么是3,a.是什么意思 print(a.add(1, 2))
幻灰龙 2023-08-18
  • 举报
回复
@m0_70361853 模块a里面的add函数,在import a后,可以用a.add调用
飞天使star 2023-07-28
  • 打赏
  • 举报
回复 3

补充刚刚说的, 就和楼主说的意思一样

在程序作为主模块运行时执行一些特定代码
而在程序被导入为模块时不执行这些代码。

飞天使star 2023-07-28
  • 打赏
  • 举报
回复

print("a.py是程序主入口") # 在a.py 的 主函数下面
这段话因为python b.py 引用
所以只是引用了a.py --> a.py模块的__name__变量是: a
因为是被引用的,所以没有被输出
if name == "main": 下面的内容

简而言之, python 后面跟的模块名,是可以被 if name == "main": 当中 name 所替代,取决于 是不是被其他模块调用

a.py中

  • 打赏
  • 举报
回复 3
楼主大人,我连这个都看不懂怎么办
幻灰龙 2023-06-16
  • 举报
回复 6
@遥远的救世主117 那就按你能懂的方式持续写代码,不懂的先忽略
小牧ma 2023-10-30
  • 举报
回复 5
@幻灰龙 这个回答太暖心了,因为我也有很多特别简单的也看不懂,一般大佬上来可能就嫌弃了
2401_84300504 2024-04-26
  • 举报
回复
@遥远的救世主117 就是b.py不会调用a.py在ifname=main的函数,但是会调用不在这个函数里的其他函数
萧麓 2023-06-06
  • 打赏
  • 举报
回复 1
具体什么情况下要写这个代码呢,我们老师用头歌叫我们,但是这串代码都是他帮我打好了。而且为什么执行模块b的时候会输出a的相关值呢?
幻灰龙 2023-06-06
  • 举报
回复 8
@萧麓 因为 python b.y 执行的时候。 由于 b.py 里第一行 "import a" 会被python解释器执行,import a 语句会触发python 加载 a.py, 当加载 a.py 的时候,a.py 文件里的代码会被执行,a.py里的全局代码(不包裹在函数里的代码)就会被执行,这行代码"print("a.py模块的__name__变量是:", __name__)" 就会输出 a模块自己模块内的 __name__ 变量的值,这个时候,a.py 是被 b.py 通过import 语句加载的,此时 __name__ 的值是字符串 "a"
  • 打赏
  • 举报
回复
python b.py 那里还是不懂,为什么a.py变a了 是和import a 有关吗 然后就是3
幻灰龙 2023-06-07
  • 举报
回复 4
@请督促我学习我不够自律 python a.py 和 python b.py ,这里a.py 和 b.py 只是代码,他们都是被 python 这个程序加载、解释执行的。python 的规范约定了,python b.py 由于b.py是python直接加载的,此时b.py里的__name__被python程序指定为"__main__",而由于此时 "import a.py" 这个语句是在b.py里的,Python程序得到这个消息后,就把a.py里的__name__变量动态的设置为"a"。这个核心是 Python 如何根据文件是否是直接加载的还是被动态 import 来决定。
(OAO) 2023-05-31
  • 打赏
  • 举报
回复 3
很有帮助,关注博主了❤️
九倾 2023-04-25
  • 打赏
  • 举报
回复 1
学渣没看懂,怎么办,哇😭
幻灰龙 2023-04-26
  • 举报
回复 1
@九倾 具体是哪点不懂?
f370518328 2023-04-22
  • 打赏
  • 举报
回复
不错哦
倔强D鱼 2023-03-14
  • 打赏
  • 举报
回复

soga~

m0_74253709 2023-03-02
  • 打赏
  • 举报
回复

持续学习

weixin_44616020 2023-03-02
  • 打赏
  • 举报
回复 6

这段解释非常详细,完整地解释了 if name=="main": 的作用。总结一下,这段代码的作用是在程序作为主模块运行时执行一些特定代码,而在程序被导入为模块时不执行这些代码。这个条件通常用于测试模块或执行模块的初始化操作。当我们直接运行某个 .py 文件时,该文件会作为主模块运行,此时 if name=="main": 中的代码会被执行;当我们将该文件导入为模块时,if name=="main": 中的代码则不会被执行。

幻灰龙 2023-03-02
  • 举报
回复 5
@weixin_44616020 另外一方面,这是一个从一开始就养成 “尽量不写全局代码” 的好习惯。工程代码和碎片代码是有差异的。习惯了碎片代码后,模块化思维就比较差。
加载更多回复(2)

2,072

社区成员

发帖
与我相关
我的任务
社区描述
️我是一个CSDN-AI机器人,在巴贝奇的分析机上写代码,欢迎和我交流,我会持续成长。
社区管理员
  • CSDN-Ada助手
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧