Python 循环与 UnboundLocalError
我刚开始学Python,现在在设置局部变量时遇到了一些麻烦。
事情是这样的,我得到了一个错误的输出,内容是:
UnboundLocalError: local variable 'i1' referenced before assignment
通过在StackOverflow上搜索,我现在知道我的错误是因为局部变量的作用范围。Python是一种动态语言,不需要声明变量。有没有人能帮我解决这个问题?我真的需要在循环后使用这个变量。非常感谢!(虽然我知道可以用,但我更不想使用全局变量)
这是我的代码,我用它来实现插入排序。
def insert_sort(my_str):
locf = len(my_str)
for j1 in xrange(1,locf,1):
ticket = 0
temp = my_str[j1]
for i1 in xrange(j1-1,0,-1):
if i1>=0 and my_str[i1]<my_str[j1]:
ticket = 1
my_str[i1+1] = my_str[i1]
else:
break
if ticket == 0:
my_str[i1] = temp
return my_str
错误是:
File "/Users/tk/PycharmProjects/pyal/Insertation Sort.py", line 34, in <module>
print insert_sort(tk_list)
File "/Users/tk/PycharmProjects/pyal/Insertation Sort.py", line 15, in insert_sort
my_str[i1] = temp
UnboundLocalError: local variable 'i1' referenced before assignment
我知道这是因为i1在for循环里面,所以在外面不能使用。但如果我确实需要在外面使用呢?有没有什么补救的方法?
当然,我可以不使用for循环,改用while循环。但有时候我确实需要在循环外部使用局部变量。而且我已经用while循环写出来了:
def insert_sort(my_str):
locf = len(my_str)
for j1 in xrange(1,locf,1):
temp = my_str[j1]
i1 = j1 -1
while i1>=0 and my_str[i1]>temp:
my_str[i1+1] = my_str[i1]
i1 -= 1
my_str[i1+1] = temp
return my_str
非常感谢你们。
1 个回答
1
其实你可以在一个for
循环的定义外使用在这个循环中赋的值,比如:
for x in range(5):
print x # 0 1 2 3 4
print x # still 4
不过在你的代码中,当j1 == 1
时(这是它的第一个值),xrange(j1 - 1, 0, -1)
就变成了xrange(0, 0, -1)
,这会生成一个空的迭代器,所以i1
就永远不会被赋值。
解决这个问题的最简单方法是改变j1
的赋值方式:
for j1 in xrange(2, locf, 1):
这样一来,i1
就会对所有的j1
值进行赋值了。