错误代码:UnboundLocalError:赋值前引用的局部变量

时间:2013-07-10 00:54:42

标签: python computer-science

似乎很多人都会遇到这个错误,但每种情况都不同。 我搜索有点长,但我不明白如何使用它为我的情况.. 我甚至试图获得现场帮助......

我的代码:

i = 0

def sort(a):

    b = len(a)

    if(i == b):
        print (a)

    elif(b == 0):
        print ('Error. No value detected...')

    elif(b == 1):
        print (a)

    elif(a[i]>a[i+1]):
        a[i], a[i+1] = a[i+1], a[i]

        i = i + 1
        print(a)
        sort(a)

错误代码:

Traceback (most recent call last):
 File "<string>", line 301, in runcode
 File "<interactive input>", line 1, in <module>
 File "(File location, you don't need to know....)", line 8, in sort
   if(i == b):
 UnboundLocalError: local variable 'i' referenced before assignment

抱歉我不熟悉代码块的东西..

我不确定这个错误意味着什么或错误...

先谢谢。

4 个答案:

答案 0 :(得分:1)

由于您已为其分配,因此变量isort()函数中的局部变量。但是,您在为其分配任何内容之前尝试使用它,因此您会收到此错误。

如果您打算使用全局变量i,则必须在函数中的某处包含语句global i

答案 1 :(得分:1)

您的函数无权访问变量i。定义i INSIDE函数。 另外,如果i = 0,并且您想要if b==i的分支,为什么还需要elif b==0的单独分支?好奇。

答案 2 :(得分:1)

您的变量i是在全局(模块)级别定义的。见Short Description of the Scoping Rules? 获取信息python查找变量的顺序。如果您只尝试从函数中引用变量,那么您将不会收到错误:

i = 0

def foo():
    print i

foo()

由于没有局部变量i,因此找到并使用全局变量。但是如果在函数中分配给i,则会创建一个局部变量:

i = 0

def foo():
    i = 1
    print i

foo()
print i

请注意,全局变量保持不变。在您的情况下,您包含行i = i + 1,因此创建了一个局部变量。但您尝试在为此变量分配任何值之前引用该变量。这说明了您遇到的错误:

i = 0

def foo():
    print i
    i = 1

foo()

在你的函数中声明global i,告诉python使用全局变量而不是创建一个本地变量,或者完全重写你的代码(因为它没有像我怀疑的那样执行)

答案 3 :(得分:0)

实际上,遇到此错误的每种情况都是相同的:您在全局上下文中定义变量,在本地上下文中引用它,然后在该上下文中对其进行修改。当Python解释您的函数时,它会识别您在函数中修改的所有变量并创建它们的本地版本。由于在修改之前你没有分配给i,所以你引用了一个未定义的局部变量。

在函数内部定义i或使用global i通知Python您希望通过该名称对全局变量进行操作。