I get a confusion...
why they have different errors?
or like JavaScript?
print(val1) #NameError: name 'val1' is not defined
val1 = 20
def foo1():
print(val2) # NameError: name 'val2' is not defined
foo1()
def foo2():
print(val3) # UnboundLocalError: local variable 'val3' referenced before assignment
val3 = 20
foo2()