edo1z blog

プログラミングなどに関するブログです

Python3 - 変数のスコープについて

下記コードのとき結果は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()