python中的奇怪问题:UnboundLocalError:赋值前引用的局部变量'y'

时间:2016-01-29 09:49:18

标签: python concept

如果在我的程序中遇到一个奇怪的问题。如果将我的代码简化为以下内容:

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()

2 个答案:

答案 0 :(得分:1)

检查this answer中的LEGB规则以获得一般答案。

在您的非工作的第一个示例中,y是一个局部变量,但它未被分配并引发异常。不提高它的危险性会大得多,因为其他情况下的错误很容易被忽视(变量的值可以不经意地从父函数中获取)。

在第二个示例中,y不是局部变量,因此通过LEGB规则,y变量可以在其父函数中找到,并且一切正常。

最后一个示例有效,因为您使用的是始终分配的局部变量_y

答案 1 :(得分:0)

在'if'语句中的内部xx()函数中创建的y变量将覆盖外部y变量。因此,当您在xx()中调用print y时,它指的是未分配的本地y变量。

您的修复工作正常,因为现在_y是一个局部变量,并且始终在到达print _y之前分配。