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