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