Pythonではグローバル変数はどのように機能しますか?私はグローバル変数が悪であることを知っています、私はただ実験しています。
これはpythonでは機能しません:
G = None
def foo():
if G is None:
G = 1
foo()
エラーが発生します:
UnboundLocalError: local variable 'G' referenced before assignment
何が悪いのですか?
global
ステートメントが必要です:
def foo():
global G
if G is None:
G = 1
Pythonでは、割り当てる変数がデフォルトでローカル変数になります。これらをグローバル変数として宣言するには、global
を使用する必要があります。一方、参照するが割り当てない変数は、自動的にローカル変数にはなりません。これらの変数は、包含スコープ内の最も近い変数を参照します。
Python 3.xは nonlocal
ステートメントを導入します。これはglobal
に似ていますが、変数を最も近い囲みスコープにバインドします。例えば:
def foo():
x = 5
def bar():
nonlocal x
x = x * 2
bar()
return x
この関数は、呼び出されると10を返します。
G
をglobal
として宣言する必要がありますが、その理由は次のとおりです。関数内の変数を参照するときはいつでも、setその関数内のどこかに変数がある場合、 Pythonは、それがローカル変数であると想定します。そのため、その名前のローカル変数がコードのその時点で存在しない場合、UnboundLocalError
を取得します。あなたの質問のように、実際にはグローバル変数を参照することを意味し、global
キーワードを使用してPythonに指示する必要があります。
関数内のどこにも変数を割り当てず、その値にのみアクセスする場合、Pythonは、存在する場合、その名前のグローバル変数を使用します。
G = None
def foo():
if G is None:
print G
foo()
このコードはNone
を出力し、UnboundLocalErrorをスローしません。
その関数内から、Gをグローバルとして宣言する必要があります。
G = None
def foo():
global G
if G is None:
G = 1
foo()
print G
それは単に出力します
1
次のような関数でGをグローバルとして定義します。
#!/usr/bin/python
G = None;
def foo():
global G
if G is None:
G = 1;
print G;
foo();
上記のpythonは1
を出力します。
このようなグローバル変数を使用することは悪い習慣です。理由は次のとおりです。 http://c2.com/cgi/wiki?GlobalVariablesAreBad