Python 循环与 UnboundLocalError

0 投票
1 回答
2005 浏览
提问于 2025-04-18 05:18

我刚开始学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

我知道这是因为i1for循环里面,所以在外面不能使用。但如果我确实需要在外面使用呢?有没有什么补救的方法?

当然,我可以不使用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值进行赋值了。

撰写回答