Python中的__main__与作用域

65 投票
5 回答
27598 浏览
提问于 2025-04-16 10:28

我对以下行为感到有些惊讶:

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 的教程

在执行的任何时刻,至少有三个嵌套的范围,它们的名称空间是可以直接访问的:

  • 最内层的范围,首先会被搜索,包含局部变量
  • 任何封闭函数的范围,从最近的封闭范围开始搜索,包含非局部但也不是全局的变量
  • 倒数第二个范围包含当前模块的全局变量
  • 最外层的范围(最后被搜索)是包含内置变量的名称空间

撰写回答