python全局变量,这里发生了什么?需要说明

时间:2012-09-17 14:39:05

标签: python

有人可以解释这里发生了什么

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仅在我需要在本地修改全局变量时才有用。

5 个答案:

答案 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失败,因为未初始化局部变量