web-dev-qa-db-ja.com

Pythonでグローバル変数を設定できないのはなぜですか?

Pythonではグローバル変数はどのように機能しますか?私はグローバル変数が悪であることを知っています、私はただ実験しています。

これはpythonでは機能しません:

G = None

def foo():
    if G is None:
        G = 1

foo()

エラーが発生します:

UnboundLocalError: local variable 'G' referenced before assignment

何が悪いのですか?

31
slim

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を返します。

62
Greg Hewgill

Gglobalとして宣言する必要がありますが、その理由は次のとおりです。関数内の変数を参照するときはいつでも、setその関数内のどこかに変数がある場合、 Pythonは、それがローカル変数であると想定します。そのため、その名前のローカル変数がコードのその時点で存在しない場合、UnboundLocalErrorを取得します。あなたの質問のように、実際にはグローバル変数を参照することを意味し、globalキーワードを使用してPythonに指示する必要があります。

関数内のどこにも変数を割り当てず、その値にのみアクセスする場合、Pythonは、存在する場合、その名前のグローバル変数を使用します。

G = None

def foo():
    if G is None:
        print G

foo()

このコードはNoneを出力し、UnboundLocalErrorをスローしません。

9
David Z

その関数内から、Gをグローバルとして宣言する必要があります。

G = None

def foo():
    global G
    if G is None:
        G = 1

foo()
print G

それは単に出力します

1
8
Mark Rushakoff

次のような関数で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

2
Nope