2017-09-05 10 views
0

最近私は十分に私を疑問に思ったコードでバグを見つけました。Pythonグローバル変数スコープ

def test(): 
    print(memory) 


if __name__ == "__main__": 
    memory = 1 
    test() 

memoryは、ファイルの先頭に定義されたが、これは私のためにすべてのスコープ規則を破るように思えるされた場合、それは明らかである:主な問題は、以下のコードが動作することです。しかし何らかの理由があるはずです。

+0

は、私には論理的なようです。 'test()'が呼ばれるまでに、 'memory'はすでに定義されています。 – ifconfig

+1

Pythonはプログラムを実行するためにプログラムを実行します。 yiuが関数を定義するとき、それはあなたがそれを呼び出すときにのみ実行されるので、Pythonは最初の実行で内部を見ることさえありません。あなたは 'test()'への呼び出しをその関数自体の内容に置き換えると仮定するかもしれません。 – avloss

+0

@ifconfig経験後の論理?私は、宣言がコンパイルされないうちに関数内でグローバル変数を使用するCとコードを使用していました。これは私にとっては論理的だと思われます。 –

答えて

0

メモリ変数の動作が奇妙に見えても、それが期待されます。 Variable Scopeは違反していません!

場合__name__ ==「__main__」: - この文は、ソースファイルが実行のために直接呼び出すのではなく、別のファイルにインポートし、第3のモジュールから呼び出されたグローバルな機能の定義や宣言するために使用されています。 (ないovershadowing起こっ)グローバルであることが、メモリ及び機能グローバル変数として試験にアクセスすることができる - あなたは直接ソースファイルを実行するとき

したがって、それは最初の変数を定義します。

はより理解するため、以下のリンクを参照してください - What does if __name__ == "__main__": do?

関連する問題