8

范围是if __name__ == __main__什么?这个声明是否涵盖了全局空间中的所有内容?

4

4 回答 4

12

块没有什么特别之处if __name__ == '__main__'。也就是说,它的范围是由它发生的地方决定的。由于此类块通常发生在顶层,因此它们的范围是全局的。

如果这个块出现在一个完全合法的函数中,它的作用域将是本地的——除了它__name__仍然会解析为模块中定义的全局值。

于 2012-10-09T19:30:35.057 回答
6
>>> if __name__ == '__main__':
...     x = 1
... print 'x' in globals()
True

编辑:user4815162342 提出了一个很好的观点,即这个 if 语句可以在任何范围内编写。它最常写在全局范围内。

这是一个函数内部:

>>> def foo():
...     if __name__ == '__main__':
...         bar = 1
... foo()
... print 'bar' in globals()
False
于 2012-10-09T19:31:52.947 回答
3

Python 没有块本地范围,因此您在if块内使用的任何变量都将添加到最近的封闭“真实”范围。(对于一个if..main块,它们通常是模块的属性。)

于 2012-10-09T19:32:27.440 回答
2

只要满足以下条件,它就在全局范围内:

  1. 它在全局范围内调用,即不在函数内调用
  2. 它在正在执行的代码文件中。

为了说明(2)

假设您的代码是 in foo.py,并且 in bar.py,您有语句from foo import *。在这种情况下,不执行if __name__ == "__main__":块 in 。foo.py此块仅在运行时foo.py执行

于 2012-10-09T19:52:55.020 回答