1. ホーム
  2. python

[解決済み] pythonのグローバル変数の警告 [重複] [重複

2022-02-07 18:32:35

質問

Python 2.6スクリプト(少なくとも2.7にアップグレードすべきなのは分かっています)は、以下のようなものです。

ret_code = 0

def some_func()
  global ret_code
  ...

if __name__ == '__main__':
  global ret_code
  ...

今、このコードを実行すると、警告が表示されます。 *SyntaxWarning: name 'ret_code' is assigned to before global declaration global ret_code* (構文警告:名前 'ret_code' はグローバル宣言の前に割り当てられています。

なぜこのような警告が出るのでしょうか?

することで解決できるのですが。

def some_func()
      global ret_code
      ...

if __name__ == '__main__':
  global ret_code
  ret_code = 0 #assign 0 here instead of above
  ...

それでも私の質問の答えにはなっていない。元のコードのどこが問題なのでしょうか?

解決方法は?

この問題を解決するための最も直接的な方法は、以下のように global の下にある宣言 if __name__ == '__main__': . そこでは必要ない。他のいくつかの言語とは異なり if そのブロックの中で代入された変数はグローバルなものであり、それは単に if があります。

これはまた、なぜエラーになるのかを説明します:変数を global の場合、以前にその変数名を同じスコープで使っていたことは許されません(おそらく、その変数名を使うと global ステートメントを使用して、代入を行うことができます。 以前 Pythonは同じ名前が同じスコープでグローバルとローカルの両方に存在することをサポートしていません)。そのため if は新しいスコープを導入しないので、最初の代入は ret_code の下にあるグローバル宣言と同じスコープになります。 if しかし、グローバル宣言は代入よりも後に来るので、これは許されません。

さらに良い解決策としては、プログラムから変更可能なグローバルな状態を完全に取り除くことができないか考えてみてください。ここでは、おそらく ret_code をプログラムの終了コードとして使用します。 sys.exit(ret_code) しかし、どの出口コードを使うかは、関数の中で決めています。その代わり、トップレベルのコードに十分な情報を渡し、その中から それ を使用して、どの終了コードを使用するかを決定します。