我对以下行为感到惊讶:
def main():
print "%s" % foo
if __name__ == "__main__":
foo = "bar"
main()
即。模块函数可以访问__main__
中的封闭变量。它的解释是什么?
答案 0 :(得分:24)
当前模块全局范围中的变量在模块中的任何位置都可见 - 此规则也适用于__main__
模块。
在执行期间的任何时候,至少有三个嵌套的作用域,其名称空间可以直接访问:
- 首先搜索的最里面的范围包含本地名称
- 任何封闭函数的范围,从最近的函数开始搜索 封闭范围,包含非本地名称,但也包含非全局名称
- 倒数第二个范围包含当前模块的全局名称
- 最外层范围(最后搜索)是包含内置名称的命名空间
答案 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()