Python中的__main__与作用域
我对以下行为感到有些惊讶:
def main():
print "%s" % foo
if __name__ == "__main__":
foo = "bar"
main()
也就是说,一个模块里的函数可以访问到在__main__
中定义的变量。这是为什么呢?
5 个回答
9
foo是一个模块级的全局变量(它不在任何函数里面)。模块内的所有地方都可以访问它。
18
这里的关键是:
if __name__ == "__main__":
foo = "bar"
这段代码在脚本中定义了一个叫做 foo 的全局变量。所以这个模块里的任何函数都可以访问到它。
上面提到的这段代码是全局的,属于整个模块,而不是某个具体的函数里面。
46
在当前模块的全局范围内,变量可以在模块的任何地方被访问——这个规则在 __main__
模块中也是适用的。
来自 Guido 的教程:
在执行的任何时刻,至少有三个嵌套的范围,它们的名称空间是可以直接访问的:
- 最内层的范围,首先会被搜索,包含局部变量
- 任何封闭函数的范围,从最近的封闭范围开始搜索,包含非局部但也不是全局的变量
- 倒数第二个范围包含当前模块的全局变量
- 最外层的范围(最后被搜索)是包含内置变量的名称空间