python例外ハンドラの変数スコープの謎

python例外ハンドラの変数のスコープおかしくない?

def hoge(x):
    e = "out"
    print(f"1: {e}")

    try:
        print(100 / x)
    except ZeroDivisionError as e:
        print("error:", e)

    print(f"2: {e}")


hoge(int(sys.argv[1]))

例外が発生しなかった場合は以下のようになる

$ python hoge.py 1
1: out
100.0
2: out

例外が発生した場合は、以下どちらかになると予想できるのだが・・・

$ python hoge.py 0
1: out
error: division by zero
2: out
$ python hoge.py 0
1: out
error: division by zero
2: division by zero

実際の実行結果は・・・

$ python hoge.py 0
1: out
error: division by zero
Traceback (most recent call last):
  File "/Users/nyan/hoge.py", line 16, in <module>
    hoge(int(sys.argv[1]))
  File "/Users/nyan/hoge.py", line 13, in hoge
    print(f"2: {e}")
UnboundLocalError: local variable 'e' referenced before assignment

UnboundLocalErrorと言う例外が出た

  • 例外ハンドラでローカル変数と同じ変数名を使う
  • 例外が発生する

という条件でローカル変数が未初期化状態に戻されてしまうらしい・・・