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>本地。当函数被“编译”时,确定函数中可用的范围的变量。也就是说,变量不能从全局到局部,在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的意思)。