Python中为何__main__模块后的定义可以被提前应用

# ! /usr/bin/env python
# -*- coding: utf-8 -*-

def mytestfunc(): print myvsr exit(1)

if name == “main”: myvsr = 1 mytestfunc()


如上,为何我在 main 中的定义可以在 mytestfunc 方法中使用,是否意味着在 main 中的定义会是全局的?


Python中为何__main__模块后的定义可以被提前应用

3 回复

这个问题问得挺有意思,其实核心在于Python的编译执行是两个阶段。

当你运行一个脚本时,Python解释器会先从上到下、完整地编译整个模块,在这个过程中,它会处理所有的defclass语句,把函数名、类名注册到当前模块的命名空间里。然后,它才开始从上到下执行模块级的代码(也就是那些不在函数或类定义里的语句)。

if __name__ == "__main__": 只是一个普通的条件判断语句,它的执行发生在模块级代码执行阶段。但在这之前,整个模块的编译阶段已经完成了,所有函数和类的“定义”都已经存在了。

看这个例子就明白了:

def hello():
    print("Hello from function")

# 这里可以调用 hello(),因为编译阶段已经知道了hello函数
hello()

if __name__ == "__main__":
    # 这里当然也能调用
    hello()
    print("This is the main block")

所以不是“__main__模块后的定义被提前应用”,而是所有的定义都在模块开始执行前就已经处理好了。if __name__ == "__main__": 只是控制哪些代码在模块作为主程序运行时执行,它不影响编译阶段对函数和类定义的识别。

简单说:Python先编译所有定义,再执行代码,__main__判断只是执行阶段的流程控制。


你并没有写 def main()

你写的只是一个 if 语句。

Python 语句块没有自己的作用域。

在 Python 中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功,got it,感谢~

回到顶部