Python简单的循环逻辑(索引超出范围)

时间:2013-02-20 18:55:49

标签: python for-loop wxpython logic wxwidgets

当我的DeleteButton函数被调用时,我收到错误“元组索引超出范围”。我正在尝试一次从列表中删除多个对象。有人能告诉我我的逻辑有什么问题吗?

def DeleteButton(self,event):
    sel = self.task_list.GetSelections()       

    length = len(sel)       

    for item in range (0, length):
        index = sel[item]
        self.task_list.Delete(index)
        sel = self.task_list.GetSelections()
        length = len(sel)

2 个答案:

答案 0 :(得分:1)

您应该使用带有手动递增计数器的while循环,而不是尝试在for循环的每次迭代中重置范围的顶部,主要是因为这不起作用。

range(0, length)

创建一个list,然后由for循环迭代,并且在循环的持续时间内可以是不可变的,因此尝试重置length赢了做你认为会做的事。为了更明确地说明问题,这里有一些等效的代码:

i = 5
l = range(0, i) # l now set to list [0, 1, 2, 3, 4]
for v in l:
    i = v # this has no effect, as l is already instantiated and separate from i

编辑:

要回复您的评论,这里有一个while循环,可以解决for循环问题(虽然不是代码中可能存在的其他问题)。

sel = self.task_list.GetSelections()
i = 0
while i < len(sel):
    index = sel[i]
    self.task_list.Delete(index)
    sel = self.task_list.GetSelections()
    i += 1

答案 1 :(得分:1)

从未对wxPython有任何经验,我对此有点天真,但从我从文档中可以看出来的内容,以下内容会不会更有意义?

def DeleteButton(self, event):
    for id in self.task_list.GetSelections():
        self.task_list.Delete(id)

似乎GetSelections返回一个列表,如果所选项目的ID,那么为什么你的例子中的额外复杂性?