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

edit : 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) を説明するには:

コードが infoo.pyで、 inbar.pyにステートメントがあるとしますfrom foo import *。この場合、if __name__ == "__main__":ブロックインfoo.pyは実行されません。このブロックは、実行時にのみ実行されfoo.pyます

于 2012-10-09T19:52:55.020 に答える