【问题标题】:Python for loop and UnboundLocalErrorPython for 循环和 UnboundLocalError
【发布时间】:2014-05-04 08:20:10
【问题描述】:

我是python新手。现在我在 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

衷心感谢。

【问题讨论】:

  • 但是通过在循环外使用i1,您使用的是它的最后一个值,对吗?

标签: python for-loop local insertion-sort xrange


【解决方案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 的所有值。

【讨论】:

  • 哇,现在我明白了……但是这个变量的作用范围呢?现在我只是有点困惑......
  • 我不明白你所说的“功能范围”是什么意思。 哪个变量?
  • 在你的情况下是 x。它何时何地不再工作......这个变量会一直保持活动状态直到函数本身结束吗?
  • 哦,我明白了。是的,它将一直保留在函数范围内,直到函数结束,并保留它在循环中的最后一个值(除非重新分配)。
  • @Tk_75963 这是一个粗略的链接;我会相信你的话!
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多