2017-05-08 11 views
5

私のプログラムでは、いくつかの状況でのみグローバル変数が必要でした。それはこのようになります言う:if文の下で 'グローバル'はどのように動作しますか?

a = 0 
def aa(p): 
    if p: 
     global a 
    a = 1 
    print("inside the function " + str(a)) 


print(a) 
aa(False) 
print("outside the function " + str(a)) 

私がする結果を期待していた。

0 
inside the function 1 
outside the function 0 

それがあることが判明しかし:

0 
inside the function 1 
outside the function 1 

をだから、私はオーケー」、考えていましたおそらくPythonコンパイラは変数がどこに位置していても 'global'キーワードが見つかるたびに変数をグローバルにします。これはPythonがグローバル変数とどのように動作するのでしょうか?私は誤解していますか?

答えて

5

はい、正しく理解しています。

globalステートメントは、実行時に評価されるものではありません。実際にはという指示文パーサーです。これは、グローバルスコープを参照するためにリストされたすべての識別子(ここではa)を処理するように指示します。 the global statementのドキュメントから:

グローバルステートメントは、現在のコードブロック全体を保持する宣言です。これは、リストされた識別子がグローバルとして解釈されることを意味します。

それから、本当にディレクティブですかglobal状態を続けて:

プログラマーズノート:globalはパーサに指示されます。それをを使用して

は条件付きではどんな違いがありません:その存在はすでに構文解析段階で検出され、その結果としてされた、名前をつかむために生成されたバイトコードは、すでに見て設定されていますグローバルスコープ(LOAD/STORE GLOBAL

dis.disの文にはglobalという文が含まれているため、globalの関連するバイトコードは表示されません。愚かな機能を使用する:それが提供する情報は、既に使用されているので、

from dis import dis 
def foo(): 
    "I'm silly" 
    global a 

dis(foo) 
    2   0 LOAD_CONST    0 (None) 
       2 RETURN_VALUE 

何もglobal aのために生成されません!

関連する問題