weird issue in python: UnboundLocalError: local variable 'y' referenced before assignment
weird issue in python: UnboundLocalError: local variable 'y' referenced before assignment
如果在我的程序中遇到一个奇怪的问题。如果将我的代码简化为以下内容:
def x(y="test"):
def xx():
if False:
y = "blubb"
print y
xx()
print y
x()
这会抛出 UnboundLocalError: referenced before assignment 错误。
如果我将代码修改为以下内容:
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()
在 'if' 语句的内部 xx() 函数中创建的 y 变量覆盖了外部 y 变量。因此,当您在 xx() 中调用 print y 时,它指的是未分配的局部 y 变量。
您的修复有效,因为现在 _y 是一个局部变量,并且总是在到达打印 _y 之前分配。
查看 this answer 中的 LEGB 规则以获得一般答案。
在你的第一个非工作示例中,y
是一个局部变量,但它没有被赋值并引发异常。不引发它的危险会大得多,因为在其他情况下,错误很容易被忽视(变量的值可能会不情愿地从父函数中获取)。
在您的第二个示例中,y
不是局部变量,因此根据 LEGB 规则,y
变量在其父函数中找到,并且一切正常。
最后一个示例有效,因为您使用了始终分配的局部变量 _y
。
如果在我的程序中遇到一个奇怪的问题。如果将我的代码简化为以下内容:
def x(y="test"):
def xx():
if False:
y = "blubb"
print y
xx()
print y
x()
这会抛出 UnboundLocalError: referenced before assignment 错误。
如果我将代码修改为以下内容:
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()
在 'if' 语句的内部 xx() 函数中创建的 y 变量覆盖了外部 y 变量。因此,当您在 xx() 中调用 print y 时,它指的是未分配的局部 y 变量。
您的修复有效,因为现在 _y 是一个局部变量,并且总是在到达打印 _y 之前分配。
查看 this answer 中的 LEGB 规则以获得一般答案。
在你的第一个非工作示例中,y
是一个局部变量,但它没有被赋值并引发异常。不引发它的危险会大得多,因为在其他情况下,错误很容易被忽视(变量的值可能会不情愿地从父函数中获取)。
在您的第二个示例中,y
不是局部变量,因此根据 LEGB 规则,y
变量在其父函数中找到,并且一切正常。
最后一个示例有效,因为您使用了始终分配的局部变量 _y
。