每个 Python 开发者都至少会经历一次 UnboundLocalError 的过错,初度遇到这种过错会觉得莫名其妙,用这张图来描绘当时的心情最为贴切:
比方下面的代码在 foo 函数中给 x 自增 1:
x = 10def foo(): x += 1 print(x)foo()
调用 foo() 的时候,仓库日志通知咱们:部分变量 x 赋值前在其它地方被引用了,换句话说就是 x 在当前效果域内还没有定义就拿来使用了。
Traceback
(most recent call last): File "unboundtest.py", line 8, in foo() File
"unboundtest.py", line 4, in foo x += 1UnboundLocalError: local variable
'x' referenced before assignment
明明 x 在函数 foo 的外面定义了,为什么却告知咱们说 x 没赋值就被引用了呢?
由于这是几乎每个人都会遇到的过错,所以 Python 官方把这个问题收入到了它的 FAQ 中,它是这样说的:
This
is because when you make an assignment to a variable in a scope, that
variable becomes local to that scope and shadows any similarly named
variable in the outer scope.
翻译过来就是,当你在部分效果域中给变量赋值时,那么这个变量就会变成一个部分变量,不管它在外部有没有初始化。如果外部效果域有相同姓名的变量,那么对部分空间来说这些相同姓名的全局变量都将被躲藏为不可见的。
在这里,x
+= 1等价于x = x + 1,首先会履行 x + 1 操作,然后再赋值给 x。而履行加法操作之前它会先查找变量
x,依据官方的这个解说所述, Python 认为 x 对函数 foo 来说一个部分变量,由于它有赋值操作,已然 x
是部分变量,在履行加法操作时,又引用了 x,所以抛出了 UnboundLocalError 异常。
就是以上这些,希望你能有所收成。