似乎很多人都会遇到这个错误,但每种情况都不同。 我搜索有点长,但我不明白如何使用它为我的情况.. 我甚至试图获得现场帮助......
我的代码:
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
抱歉我不熟悉代码块的东西..
我不确定这个错误意味着什么或错误...
先谢谢。
答案 0 :(得分:1)
由于您已为其分配,因此变量i
是sort()
函数中的局部变量。但是,您在为其分配任何内容之前尝试使用它,因此您会收到此错误。
如果您打算使用全局变量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您希望通过该名称对全局变量进行操作。