__main__和python中的作用域

Dav*_*eau 29 python scope

我有点惊讶于以下行为:

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

if __name__ == "__main__":
    foo = "bar"
    main()
Run Code Online (Sandbox Code Playgroud)

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

Sve*_*ach 27

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

来自Guido的教程:

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

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

  • @AA:Python 将主脚本视为名为“__main__”的模块。您甚至可以执行“import __main__”(但通常这是一个坏主意)。 (2认同)

San*_*dri 7

这里的事情是:

if __name__ == "__main__":
    foo = "bar"
Run Code Online (Sandbox Code Playgroud)

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

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


sin*_*law 6

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


kyn*_*tto 5

在Python中,有全局作用域,函数也有自己的作用域。所以如果你在 name==main 下定义 foo ,它就在全局范围内。此外,如果在函数调用时声明变量,那么在函数中使用尚未声明的变量也不是错误。