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

python全局变量,这里发生了什么?需要解释,python,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 = 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
才有用。

一旦您对函数中的任何位置进行赋值,它就会变成局部变量,即使在赋值之前有对其值的引用。

一旦对函数中的任何位置进行赋值,即使在赋值之前有对其值的引用,它也将成为局部变量。

在函数中,您将赋值给
x
,而无
全局
声明,所以
x
是一个局部变量。但是,在赋值给函数之前,您尝试读取函数中的
x
,因此此时有一个未绑定的局部变量。

在函数中,您赋值给
x
时没有
全局
声明,因此
x
是一个局部变量。但是,您尝试在函数中读取
x
,然后才将其分配给,因此在该点上有一个未绑定的本地名。

一开始可能会觉得奇怪的是本地名是静态检测的:如果在函数中的任何位置分配了名称
x
,Python假定
x
是函数中所有地方的本地名称


换句话说,函数中的行顺序是误导性的:只要在函数中的某个位置分配了
x
,第一行的
x
就变成了对局部变量的引用(在这个代码点上仍然是未绑定的).

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


换句话说,函数中的行顺序是误导性的:只要在函数中的某个地方指定了
x
,第一行的
x
就成为对局部变量的引用(在这个代码点上仍然是未绑定的)。

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

def foo():  
   global x  
   print "x in foo = ",x  
   if x: x = 8 

正如Wooble已经说过的,在使用前需要声明对全局变量的修改

def foo():  
   global x  
   print "x in foo = ",x  
   if x: x = 8 

x=8
函数中没有
global x的任何位置将使其成为局部变量<代码>打印x
失败,因为未初始化局部变量

x=8
函数中没有全局x的任何位置使其成为局部变量<代码>打印X <代码>失败,因为本地变量未初始化

但您正在本地修改<代码> x/COD>。当函数被“编译”时,确定函数中可用范围的变量。也就是说,变量不能从“全局”到“局部”在代码“>”()的中间。但是,您正在修改<代码> x/COD>本地。当函数被“编译”时,确定函数中可用的范围的变量。也就是说,变量不能从全局到局部,在 FULL()/代码>的中间。我还有一个疑问:“Python假定x在函数中到处都是一个本地名”,那么为什么下面代码中的局部变量()没有将“x”打印为局部变量x=10 def foo():print locals()print“x in foo=”,如果x:x=8 foo()print“x in main=”,则为x,x@narendra_l:
locals()
仅返回本地命名空间中实际绑定的名称;解释器知道该名称空间中的名称在编译时只能是本地名称,即使在您运行
locals()
@Wooble时它没有绑定:您的意思是当编译器执行locals()时,“x”没有绑定到本地名称空间?在将其分配给之前,本地符号表中没有名称
x
。(这正是UnboundLocalError的意思)。我还有一个疑问,如果“Python假设x在函数中的任何地方都是本地名称”,那么为什么下面代码中的locals()没有将“x”打印为本地变量x=10 def foo():print locals()print“x in foo=”,x if x:x=8 foo()print“x in main=”,x@narendra_l:
locals()
仅返回本地命名空间中实际绑定的名称;解释器知道该名称空间中的名称在编译时只能是本地名称,即使在您运行
locals()
@Wooble时它没有绑定:您的意思是当编译器执行locals()时,“x”没有绑定到本地名称空间?在将其分配给之前,本地符号表中没有名称
x
。(这正是UnboundLocalError的意思)。