__main__和python中的作用域

时间:2011-01-23 18:30:15

标签: python scope

我对以下行为感到惊讶:

def main():
    print "%s" % foo

if __name__ == "__main__":
    foo = "bar"
    main()

即。模块函数可以访问__main__中的封闭变量。它的解释是什么?

5 个答案:

答案 0 :(得分:24)

当前模块全局范围中的变量在模块中的任何位置都可见 - 此规则也适用于__main__模块。

来自Guido's tutorial

  

在执行期间的任何时候,至少有三个嵌套的作用域,其名称空间可以直接访问:

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

答案 1 :(得分:7)

这里的事情是:

if __name__ == "__main__":
    foo = "bar"

在该脚本中定义名为foo的全局变量。所以该模块的任何功能都可以访问它。

上面列出的代码片段对于模块是全局的,而不是任何函数内部。

答案 2 :(得分:6)

foo是一个模块全局变量(它不在任何函数中)。模块中的所有范围都可以访问它。

答案 3 :(得分:2)

在python中有全局范围,函数有自己的范围。所以你在名称== main下定义foo,它在全局范围内。另外,在函数中使用尚未声明的变量并不是错误,如果它将在函数被调用时声明。

答案 4 :(得分:0)

正如sinelaw所指出的那样,解决此烦恼和疏忽错误的方法是使用一个函数。此功能可以在“如果主要:”中,如下所示:

if __name__ == "__main__":
    def mainlet():
        foo = "bar"
    mainlet()