Python 中的 __name__ 变量

在很多 Python程序里,经常会看到这样的一段代码:

if __name__ == '__main__':
    main()

这个内置变量具体是什么含义?在写的 Python 模组里要怎样使用它?估计很多时候都是一知半解

__name__的作用

作为 Python 的内置变量,__name__变量(前后各有两个下划线)还是挺特殊的。
它是每个 Python 模块必备的属性,但它的值取决于你是如何执行这段代码的。

在许多情况下,你的代码不可能全部都放在同一个文件里,
或者你在这个文件里写的函数,在其他地方也可以用到。
为了更高效地重用这些代码,你需要在 Python 程序中导入来自其他文件的代码。

所以,在__name__ 变量的帮助下,你可以判断出这时代码是被直接运行,还是被导入到其他程序中去了。

当你直接执行一段脚本的时候,这段脚本的 __name__变量等于 '__main__',
当这段脚本被导入其他程序的时候,__name__ 变量等于脚本本身的名字。

通过以下两个例子,采取两种不同的调用方式,对它的值产生的影响进行分析

方式1 直接运行脚本

nameScript.py

def myFunction():
    print('变量 __name__ 的值是 ' + __name__)

def main():
    myFunction()

if __name__ == '__main__':
    main()


运行结果:
变量 __name__ 的值是 __main__

执行 nameScript.py 时,流程是这样处理的:
在这里插入图片描述

在所有其他代码执行之前,__name__变量就被设置为 '__main__' 了。
在此之后,通过执行 def 语句,函数 main() 和 myFunction() 的本体被载入。

接着,因为这个 if 语句后面的表达式为真 true,函数 main() 就被调用了。
而 main() 函数又调用了myFunction(),打印出变量的值'__main__'。
方式2 从其他脚本里导入

新建一个 importingScript.py 文件,将 nameScript.py 作为一个模组导入,重用这个 myFunction() 函数

importingScript.py

import nameScript as ns
ns.myFunction()

运行结果:
变量 __name__ 的值是 nameScript

为什么会出现这个结果?变量的值变成了 nameScript,也就是我们导入的模块的名称

这是因为有了两个不同的作用域:一个是 importingScript 的,一个是 nameScript 的
在这里插入图片描述

在 importingScript.py 里,__name__ 变量就被设置为 '__main__'。
当导入 nameScript 的时候,Python 就在本地和环境变量 PATH 指向的路径中寻找对应名称的 .py 文件,
找到之后,将会运行导入的文件中的代码。

但这一次,在导入的时候,它自身的 __name__ 变量就被设置为了 'nameScript',
接下来还是一样,函数 main() 和 myFunction() 的本体被载入。
然而,这一次 if 语句后面的表达式结果为假 false,所以 main() 函数没有被调用。

导入完毕之后,回到 importingScript.py 中。
现在 nameScript 模块中的函数定义已经被导入到当前的作用域中,
于是我们通过 ns.myFunction() 的方式调用模块中的函数,
这个函数返回的是模块内的变量的值 'nameScript'。
import nameScript as ns

ns.myFunction()

print(__name__)


输出结果:
变量 __name__ 的值是 nameScript
__main__
如果在 importingScript 中打印 __name__ 变量的值,那直接执行 importingScript 的时候,
它也会输出 '__main__'。原因在于,这个变量是在 importingScript 的作用域中的。
  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值