Python 关于异常UnboundLocalError的想法
起因
今天看到了一个这样的问题,代码如下 。给出的解析是 “l” 是个 listType,是可变类型所以不报错,“y” 是个intType,是不可变类型,二者对应的内存地址一个不会变,一个会变,导致第二个抛出异常。
这个个人认为是不对的
def f():
l = [1]
def _inner(x):
l.append(x)
return l
return _inner
def g():
y = 1
def _inner(x):
y += x
return y
return _inner
f1 = f()
print(f1(2))
g1 = g()
print(g1(2))
抛出异常的原因
首先上面说的可变类型与不可变类型及其对应的内存地址变化情况是没啥问题的。但是那不是抛出这个异常的直接原因
直接原因是在内部函数里对内部函数本级作用域中不存在的变量 y 进行了赋值(y += x )。 而因为没有声明y非本级作用域中变量,所以解释器默认会去内部函数作用域中去寻找变量y,找不到从而抛出异常。 这个原理与JavaScript是不同的。 第一个函数 l.append()因为不涉及赋值操作,所以不会去本级作用域寻找l 并赋值。但是如果是对l进行赋值,那么依旧会抛出异常。 这实质与内存地址无直接关键。