python中的__name__是个啥?

pycharm中随便打开一个文件,在special variables中能看到一个__name__的变量
在很多python脚本中,也经常能看到if name == "main"这样一行
所以_name_到底是个啥?
首先,我们可以确定这是一个str字符变量
在这里插入图片描述
“在 Python 中,name 是一个特殊的内置变量,它用于表示一个模块的名称。具体来说,它表示当前模块的名称或正在执行的脚本的名称。”
上面这句话是个官方解释,有可能有点云里雾里,看懂了又好像不懂。那是因为我们对模块和脚本这些概念不是十分清晰。
先来解释一下脚本(script):脚本通常指一段可以直接执行的代码,以 .py 扩展名结尾。也就是平常自己写的py文件就是一个脚本。
模块(module):模块也是py文件,只不过这个py文件有概念上的规范和限制,不是所有py文件都可以叫模块,必须是用来封装代码、使代码可以被重复使用、可以在不同的脚本中被导入和调用的py文件才称得上是module
所以可以简单的理解:脚本就是广义的py文件(py文件也就是Python文件),模块是狭义的py文件,它们都是py文件。

ok,讲完了脚本和模块,说回正题。

当一个 Python 脚本被直接运行时,它的 name 会被设置为 “main”,表示该脚本正在作为主程序执行。而当一个模块被导入到其他脚本中时,它的 name 会被设置为模块的名称。这样一来,当你希望某个模块在被直接运行时执行一些特定的操作,但在被其他模块导入时不执行这些操作。通过将这些可执行的代码放在 if name == “main”: 条件判断内部,这些代码只有在模块作为主程序运行时才会被执行。这样,当你直接运行模块时,这些代码会被执行,但如果你将模块导入到其他地方,这些代码就不会执行。通过这种机制,你可以将模块中的功能区分为两种类型的代码,使代码更具模块化和可重用性。这也能确保在导入模块时不会执行无关的操作,只有在需要的时候才会执行。
举个例子就能很好明白了:

# 模块示例

def some_function():
    print("This function can be reused in other modules.")

if __name__ == "__main__":
    # 这里的代码只有在该脚本直接运行时才会执行
    print("This script is run directly.")
    # 可以在这里放置一些在直接运行时需要执行的操作
    some_function()

当这个py文件作为主程序运行时,两个print都会输出,因为这时候的__name__是等于main的。如果这个py文件被做为module,导入道其他py文件去,在其他py文件中运行时,这个modele的__name__会被设置为他的模块名,这时候第二个print就不会执行了,也不会有任何输出。

现在,你明白了吗