本文由Python编程时光整理
大家应该已经在很多Python脚本里见到过name变量了吧?它经常是以类似这样的方式出现在我们的程序里:if__name__==__main__:main()今天,我就带大家详细扒一扒这个内置变量的用法,示范一下在你写的Python模组里要怎么用到它。这个__name__拿来做什么的?作为Python的内置变量,__name__变量(前后各有两个下划线)还是挺特殊的。它是每个Python模块必备的属性,但它的值取决于你是如何执行这段代码的。在许多情况下,你的代码不可能全部都放在同一个文件里,或者你在这个文件里写的函数,在其他地方也可以用到。为了更高效地重用这些代码,你需要在Python程序中导入来自其他文件的代码。所以,在__name__变量的帮助下,你可以判断出这时代码是被直接运行,还是被导入到其他程序中去了。这个__name__变量可能取什么值?当你直接执行一段脚本的时候,这段脚本的__name__变量等于__main__,当这段脚本被导入其他程序的时候,__name__变量等于脚本本身的名字。下面,让我举两个栗子来说明一下:情况1-直接运行脚本假设我们有一个nameScript.py,代码如下:
defmyFunction():print(变量__name__的值是+__name__)defmain():myFunction()if__name__==__main__:main()当你直接执行nameScript.py时,流程是这样处理的:在所有其他代码执行之前,__name__变量就被设置为__main__了。在此之后,通过执行def语句,函数main()和myFunction()的本体被载入。接着,因为这个if语句后面的表达式为真true,函数main()就被调用了。而main()函数又调用了myFunction(),打印出变量的值__main__。情况2-从其他脚本里导入如果你需要在其他脚本里重用这个myFunction()函数,比如在importingScript.py里,我们可以将nameScript.py作为一个模组导入。假设importingScript.py的内容如下:
importnameScriptasnsns.myFunction()这时,我们就有了两个不同的作用域:一个是importingScript的,一个是nameScript的。让我画个示意图,你就能看出这和之前的区别了:在importingScript.py里,__name__变量就被设置为__main__。当导入nameScript的时候,Python就在本地和环境变量PATH指向的路径中寻找对应名称的.py文件,找到之后,将会运行导入的文件中的代码。但这一次,在导入的时候,它自身的__name__变量就被设置为了nameScript,接下来还是一样,函数main()和myFunction()的本体被载入。然而,这一次if语句后面的表达式结果为假false,所以main()函数没有被调用。导入完毕之后,回到importingScript.py中。现在nameScript模块中的函数定义已经被导入到当前的作用域中,于是我们通过ns.myFunction()的方式调用模块中的函数,这个函数返回的是模块内的变量的值nameScript。如果你试着在importingScript中打印name__变量的值,那当你直接执行importingScript的时候,它也会输出__main。原因在于,这个变量是在importingScript的作用域中的。总结一下今天和大家一起讨论了__name__变量在模组中的特性,分析了不同的调用方式对它的值有什么影响。利用这个特性,你既可以在程序中导入模组来使用,也可以直接把模组本身作为程序来运行。
介绍一本非常经典的入门PDF,它讲解的是程序员必知的硬核基础知识,看完能让你对计算机有一个基础的了解和入门,是培养你内核的基础,我们看下目录大纲
现在这本PDF免费分享给你,你可以扫描下方