如果在我的程序中遇到一个奇怪的问题。如果将我的代码简化为以下内容:
def x(y="test"):
def xx():
if False:
y = "blubb"
print y
xx()
print y
x()
这将抛出UnboundLocalError:在赋值错误之前引用。
如果我将代码修改为以下内容:
def x(y="test"):
def xx():
print y
xx()
print y
x()
我的代码再次运作。我在使用Python 2.7。 我刚想通了,以下修复工作也是如此,这就是我现在要修复我的软件的方法:
def x(y="test"):
def xx():
_y = y
if False:
_y = "blubb"
print _y
xx()
print y
x()
答案 0 :(得分:1)
检查this answer中的LEGB规则以获得一般答案。
在您的非工作的第一个示例中,y
是一个局部变量,但它未被分配并引发异常。不提高它的危险性会大得多,因为其他情况下的错误很容易被忽视(变量的值可以不经意地从父函数中获取)。
在第二个示例中,y
不是局部变量,因此通过LEGB规则,y
变量可以在其父函数中找到,并且一切正常。
最后一个示例有效,因为您使用的是始终分配的局部变量_y
。
答案 1 :(得分:0)
在'if'语句中的内部xx()函数中创建的y变量将覆盖外部y变量。因此,当您在xx()中调用print y时,它指的是未分配的本地y变量。
您的修复工作正常,因为现在_y是一个局部变量,并且始终在到达print _y之前分配。