1

似乎很多人都会遇到此错误,但每种情况都不同。

我的代码:

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

4 回答 4

2

您的变量i是在全局(模块)级别定义的。请参阅范围规则的简短描述? 有关信息 python 查找变量的顺序。如果您只尝试从函数中引用变量,那么您将不会收到错误消息:

i = 0

def foo():
    print i

foo()

由于没有局部变量i,所以找到并使用全局变量。但是如果你i在你的函数中赋值,那么会创建一个局部变量:

i = 0

def foo():
    i = 1
    print i

foo()
print i

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

i = 0

def foo():
    print i
    i = 1

foo()

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

于 2013-07-10T01:45:22.573 回答
1

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

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

于 2013-07-10T00:59:57.593 回答
1

您的函数无权访问变量ii在函数内部定义。另外,如果i = 0,并且您想要一个分支,if b==i为什么需要一个单独的分支elif b==0?只是好奇。

于 2013-07-10T01:01:20.940 回答
0

实际上,这个错误的每一种情况都是一样的:你在全局上下文中定义一个变量,在本地上下文中引用它,然后在那个上下文中修改它。当 Python 解释您的函数时,它会识别您在函数中修改的所有变量并创建它们的本地版本。由于直到修改后才分配给 i ,因此您引用了未定义的局部变量。

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

于 2013-07-10T01:06:14.623 回答