写点什么

【Python】__name__ 是什么?

用户头像
Leetao
关注
发布于: 2020 年 07 月 07 日
【Python】__name__ 是什么?

前言


在我们浏览一下 python 文件或者自己写 python 代码的时候,时常会在代码的最后加上这样的一行代码


if __name__ == '__main__':    func_name() 
复制代码


那么这一行代码有什么具体的作用呢,不加的话会对我们的结果造成影响吗?


`_name_`


首先对于用双下划线开头且结尾的变量,在 Python 中被称为内置变量,除了 __name__,我们常见的还有 __init__dict 等等.那么有多少内置变量呢?我们可以通过下面在交互界面输入下面的命令,查看 Python 全部内置变量和内置函数


>>> dir(__builtins__)
复制代码


结果如下图:


不同情况下的 `_name_` 的值


首先我们需要知道 __name__ 在不同情况下会有不同值,它的值取决于我们是如何执行脚本的.我们可以通过几个例子感受一下:


Example 0


# test.pyprint(f'__name__ 在 test.py 值为 {__name__}')
复制代码


然后直接执行一下代码


$ python test.py
复制代码


然后看一下输出


$ python test.py __name__ 在 test.py 值为 __main__
复制代码


在这个例子中,我们发现 __name__ 的值是 __main__


Example 1


在这个例子中,我们重新创建一个脚本 test1.py 然后我们在 test1.py 中调用 test.py


# test1.pyimport testprint(f'__name__ 在 test1.py 值为 {__name__}')
复制代码


接着执行一下 test1.py,再看一下输出


python test1.py __name__ 在 test.py 值为 test__name__ 在 test1.py 值为 __main__
复制代码


结果是不是很有意思?整个过程是什么样子的呢?简单的画了一个图



什么时候使用 `_name_`


有时候,我们用 Python 写了一个脚本,当我们既希望这个脚本可以单独运行,同样希望它可以在其他的脚本中发挥作用. 这个时候就需要考虑使用 __name__ 了. 这里通过改造上面 Example 1 的例子来直观感受一下


修改一下 test.py 文件

# test.pydef hello(name):    print(f'Hello,{name}') 
if __name__ == '__main__': hello("test")
复制代码


再修改一下 test1.py 文件


# test1.pyfrom test import hellohello("test1")
复制代码


然后让我们先尝试直接运行一下 test.py,很显然这个时候, if 语句条件满足,会输出 Hello,test


$ python test.py Hello,test
复制代码


这个时候我们如果运行 test1.py,程序就会输出 Hello,test1


$ python test1.py Hello,test1
复制代码


如果我们把 if __name__ == "__main__"test.py 去掉会发生什么呢?


$ python test1.py Hello,testHello,test1
复制代码


参考


What does if name == “main”: do?


What’s in a (Python’s) name?


发布于: 2020 年 07 月 07 日阅读数: 69
用户头像

Leetao

关注

一个喜欢瞎折腾的程序员 2018.11.09 加入

微信公众号:【桃子的学习笔记】 个人网站:https://www.leetao94.cn

评论

发布
暂无评论
【Python】__name__ 是什么?