有人可以解释这里发生了什么
x = 10
def foo():
print "x in foo = ",x
if x: x = 8 -------------> mysterious line
foo()
print "x in main = ",x
在上面的代码中,如果我注释掉神秘的线条(如果x:x = 8)
我得到了输出
x in foo = 10
x in main = 10
否则我最终会出错
“UnboundLocalError:赋值前引用的局部变量'x'”
为什么会这样?
我知道global x
仅在我需要在本地修改全局变量时才有用。
答案 0 :(得分:5)
只要在函数的任何位置对x
进行赋值,它就会变成局部变量,即使在赋值之前有对其值的引用。
答案 1 :(得分:3)
在您的函数中,您指定的x
没有global
声明,因此x
是一个局部变量。但是,您尝试在分配之前读取函数中的x
,因此此时您有一个未绑定的本地。
答案 2 :(得分:2)
最初看起来很奇怪的是静态检测本地名称:如果在函数中将名称x
分配为任何地方,则Python会假设{ {1}}是函数中的本地名称无处不在。
换句话说,函数中的行顺序具有误导性:只要在函数中的某处分配x
,第一行的x
就成为对局部变量的引用(在此处代码点仍未绑定)。
答案 3 :(得分:1)
就像Wooble已经说过的那样,你需要在使用之前声明全局变量的修改。
def foo():
global x
print "x in foo = ",x
if x: x = 8
答案 4 :(得分:0)
x = 8
的函数中的任何地方的 global x
使它成为局部变量。 print x
失败,因为未初始化局部变量