Open1

PythonのUnboundLocalErrorで勘違いした話

takkiitakkii

はじめに

Python で UnboundLocalError が出た際の Traceback で勘違いしたことをメモしておきます。

動くコード

関数の中からglobal変数を参照してprintするコードがあります。
結果は 1 になります。

l = [1,2,3]

def a():
    print(l[0])

a()

# 1

UnboundLocalErrorとなるコード

下記はエラーになり、エラー箇所は関数 a の2行目と出ています。

l = [1,2,3]

def a():
    print(l[0])
    
    l += [4] # 追加

a()

#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#  File "<stdin>", line 2, in a
#UnboundLocalError: local variable 'l' referenced before assignment

JupyterLabのTracebackの方がわかりやすいかと思います

勘違い

エラーを引き起こしてるのが l[0] と思いましたが、
実際には l += [4] の影響でした。

Tracebackが l[0] に当たっていた理由は下記のような背景なのかと思いました。
違ったらアドバイスいただけるとありがたいです!

  • l += [4] というコードがあるなら local変数 l があるはずだ
  • しかしそのような変数は存在しない
  • 存在しない変数 l を最初に使用しているのは l[0]
  • Tracebackでは l[0] が原因として上がる