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

Python 错误代码:UnboundLocalError:赋值前引用的局部变量,python,computer-science,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) e

似乎很多人都会犯这种错误,但每种情况都不同。 我的搜索时间有点长,但我不知道如何在我的情况下使用它。。 我试图得到现场帮助,甚至

我的代码:

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
对不起,我对代码块不熟悉

我不知道这个错误是什么意思或者是什么错了


感谢您的高级支持。

由于您为其赋值,因此变量i是排序函数中的局部变量。但是,您试图在分配任何内容之前使用它,因此会出现此错误


如果要使用全局变量i,则必须在函数中的某个位置包含语句global i。

由于您为其赋值,因此变量i是排序函数中的局部变量。但是,您试图在分配任何内容之前使用它,因此会出现此错误


如果要使用全局变量i,则必须在函数中的某个位置包含语句global i。

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

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

实际上,这个bug的每一种情况都是一样的:您在全局上下文中定义一个变量,在本地上下文中引用它,然后在该上下文中修改它。当Python解释函数时,它会识别在函数中修改的所有变量,并创建它们的本地版本。由于在修改i之前不会将其赋值,因此引用了一个未定义的局部变量


要么在函数中定义i,要么使用global i通知Python您希望使用该名称对全局变量进行操作。

实际上,出现此错误的每种情况都是相同的:您在全局上下文中定义变量,在本地上下文中引用它,然后在该上下文中修改它。当Python解释函数时,它会识别在函数中修改的所有变量,并创建它们的本地版本。由于在修改i之前不会将其赋值,因此引用了一个未定义的局部变量

可以在函数中定义i,也可以使用global i通知Python您希望使用该名称对全局变量进行操作。

您的变量i是在全局模块级别定义的。看见 有关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使用全局变量而不是创建本地变量,要么完全重写代码,因为它不会像我猜想的那样执行

您的变量i是在全局模块级别定义的。看见 有关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使用全局变量而不是创建一个局部变量,要么完全重写代码,因为它不会像我猜想的那样执行

这很有意义,其他变量也是如此,但这个答案我最喜欢!!谢谢这很有道理,其他人也是,但这个答案我最喜欢!!谢谢谢谢这帮我解决了我的问题谢谢。这有助于解决我的问题。如果b==0,则表示列表a有0个术语,因此无法对其进行排序。如果b==0,则表示列表a有0个术语,因此无法对其进行排序。