1

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

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

4

5 回答 5

5

一旦你x对函数中的任何地方进行赋值,它就会成为一个局部变量,即使在赋值之前有对其值的引用。

于 2012-09-17T14:41:23.190 回答
3

在您的函数中,您分配给x没有global声明,x局部变量也是如此。但是,您尝试x在分配函数之前读取该函数,因此此时您有一个未绑定的本地。

于 2012-09-17T14:41:54.633 回答
2

一开始可能看起来很奇怪的是,本地名称是静态检测的:如果在函数中的任何地方x分配了名称,Python 会假定该名称是函数中任何地方的本地名称。x

换句话说,函数中的行顺序具有误导性:只要x在函数中的某处分配,第一行x就成为对局部变量的引用(在此代码点仍然未绑定)。

于 2012-09-17T14:48:42.303 回答
1

就像 Wooble 已经说过的,您需要在使用之前声明对全局变量的修改。

def foo():  
   global x  
   print "x in foo = ",x  
   if x: x = 8 
于 2012-09-17T14:51:57.070 回答
0

x = 8函数中的任何位置没有global x使其成为局部变量。print x由于未初始化局部变量而失败

于 2012-09-17T14:54:11.700 回答