の範囲はif __name__ == __main__? このステートメントは、グローバル空間ですべてを網羅していますか?
4 に答える
if __name__ == '__main__'ブロックに関して特別なことは何もありません。つまり、その範囲はそれが発生する場所によって決定されます。このようなブロックは通常トップレベルで発生するため、スコープはグローバルです。
このブロックが関数内で発生した場合、これは完全に正当であり、そのスコープはローカルになり__name__ますが、モジュールで定義されたグローバル値に解決される場合を除きます。
>>> 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
Python にはブロック ローカル スコープがないため、ifブロック内で使用する変数は、最も近い「実際の」スコープに追加されます。(if..mainブロックの場合、通常はモジュールの属性になります。)
次の場合に限り、グローバル スコープ内にあります。
- グローバルスコープで呼び出されます。つまり、関数内からではありません
- 実行中のコード ファイルにあります。
(2) を説明するには:
コードが infoo.pyで、 inbar.pyにステートメントがあるとしますfrom foo import *。この場合、if __name__ == "__main__":ブロックインfoo.pyは実行されません。このブロックは、実行時にのみ実行されfoo.pyます