Pocket
LINEで送る

下記コードのとき結果は1と表示されます。

n = 1
def hoge():
    print(n)
hoge()

下記コードのときエラーになります。

n = 1
def hoge():
    n += 1
    print(n)
hoge()

UnboundLocalError: local variable ‘n’ referenced before assignment

参考:なぜ変数に値があるのに UnboundLocalError が出るのですか?

これは、あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになり、外のスコープにある同じ名前の変数を隠すからです。foo の最後の文が x に新しい値を代入しているので、コンパイラはこれをローカル変数であると認識します。その結果、先の print(x) が初期化されていないローカル変数を表示しようとして結果はエラーとなります。

globalだよと宣言すると大丈夫になります。

n = 1
def hoge():
    global n
    n += 1
    print(n)
hoge()

ネストされたスコープだと、nonlocalが使えます。

def hoge():
    n = 1
    def page():
        nonlocal n
        n += 1
        print(n)
    page()
hoge()
Pocket
LINEで送る

カテゴリー: プログラミング

コメントください

関連記事

プログラミング

cakePHP2 – 多言語化

多言語化します。 cakephpマニュアルのこのページに説明が書いてあ 続きを読む …

プログラミング

Go言語によるビットコインのフルノード実装btcdを調べる(2)

btcdを実行した際のプログラムの流れを最初から確認してみます。 se 続きを読む …

%d人のブロガーが「いいね」をつけました。