2017-09-28 11 views
0

これに類似した質問がありましたが、この特定の質問は扱われていませんでした。Python構文警告グローバル変数割り当ての場合

global EXAMPLE_GLOBAL 
EXAMPLE_GLOBAL = True 


def Setup(): 
    if EXAMPLE_GLOBAL: 
     try: 
      #Doing some file io here 
     except: 
      global EXAMPLE_GLOBAL 
      EXAMPLE_GLOBAL = False 

このコードを実行している(正確には、これは単に基本的なロジックにこのコードストリップダウンされるわけではありません。)私が手:

SyntaxWarning:名「EXAMPLE_GLOBAL」が前のグローバル宣言に使用されている グローバルEXAMPLE_GLOBAL

グローバル変数の値を変更するには、最初に新しいスコープに移動したときにグローバル変数を参照していると指定する必要がありました。グローバルに変更するには2番目のグローバルEXAMPLE_GLOBALが必要ですか、同じ識別子を十分に使用していますか?

+0

最初の行に 'グローバルEXAMPLE_GLOBAL'を置きます –

+0

'EXAMPLE_GLOBAL'の使用法の中には、関数内の' global'宣言の前にあるものがあることを警告しています。 'global EXAMPLE_GLOBAL'があなたの関数の先頭にあったならば、あなたのコードはより明確になります。 – khelwood

答えて

2

私はあなたがはい、そうです新しいスコープ

に行ったとき、あなたが最初にあなたがグローバル変数を参照していることを指定する必要があり、グローバル変数の値を変更するには印象の下にありました。しかし、従来、グローバルな声明は、その範囲の開始に行くべきである。言い換えれば、それをあなたの関数の一番上に置きます。

EXAMPLE_GLOBAL = True 

def Setup(): 
    global EXAMPLE_GLOBAL 
    if EXAMPLE_GLOBAL: 
     try: 
      #Doing some file io here 
     except: 
      EXAMPLE_GLOBAL = False 

documentationが明示的にglobal文でそれを使用する前に、ブロック内の名前に言及しないことをお薦めします:global文に記載されている

名前はテキストで、先行する同一のコードブロック内で使用することはできませんそのグローバルステートメント。 CPythonので

パーサはブロック内のグローバルディレクティブの特定の位置を無視しますが、それは実装の詳細だと将来変更される可能性があるため、この原則に違反することだけではなく、エラーの警告を生成します。

は(もトップレベルのスコープですべての名前がそのスコープですでに効果的にグローバルである。あなたが最初の行にglobal文を必要としないことに注意してください。)

+0

あなたは素晴らしいです、ありがとうございます。あなたは、トップレベルのスコープで宣言されたすべてのグローバルが、より低いスコープで再指定する必要はないと言っていますか?私が書いているこのプログラムは、私が似たような方法で使っている10以上のグローバルを持っているからです。 – Alexzoin

+0

_ "あなたは、トップレベルのスコープで宣言されたすべてのグローバルが、より低いスコープで再指定する必要はないと言っています" _逆のことを言っている:低いスコープのグローバルは、レベルスコープ。関数/クラス/ etc定義の中にない 'global'ステートメントは効果的ではありません。グローバルなステートメントでは、「このスコープにいる間はこの名前をトップレベルのスコープにしているように扱う」と効果的に言いますが、すでにトップレベルのスコープにいる場合は何も変わりません。 (*と "declare"とは、 "最初に割り当てられた"ではなく "global"ステートメントの内部に置くことを意味します) – Kevin

関連する問題