真奇怪的python错误

时间:2014-04-06 04:22:55

标签: python

...
def splitMunipulation(p,threshold=5000):
    runs=[];i=0
    while i<len(p):
        l=[];i+=1
        print i,p[i]
        while p[i]!=press(0,1,0):
            l.append(p[i]);i+=1
        else:       
            runs.append(l)#here i points to another (0,1,0)
    return runs
...

record=splitMunipulation(record)

'''

输出:

    1 <__main__.press instance at 0x046690A8>
      File "H:\mutate.py", line 28, in splitMunipulation
        while p[i]!=press(0,1,0):
    IndexError: list index out of range

press是一个类

并且由于print p[i]运作良好,为什么p[i]被视为超出范围?

真的不知道发生了什么

'''

3 个答案:

答案 0 :(得分:3)

所以,有些事情......

首先,你的代码非常...... unpythonic。这不是C,因此您不需要使用while循环进行迭代,也不要使用分号在Python中的一行上分隔多个命令。永远。此外,while ... else格式令人困惑,应该避免使用。

如果你查看while循环的前几行'

while i<len(p):
        l=[];i+=1

您将i保持在p的长度以下,但您会立即将i的值增加一。因此,在i=len(p) - 1时,您会i一个更大,len(p)。因此,当您尝试访问p[i]时,您正在尝试访问不存在的值。

解决这些问题,你会得到:

...
def splitMunipulation(p,threshold=5000):
    runs=[]

    for i in p:
        l=[]
        print i
        if i != press(0,1,0):
            runs.append(i)
    return runs
...

record=splitMunipulation(record)

答案 1 :(得分:2)

while p[i]!=press(0,1,0):
   l.append(p[i]);i+=1

变量i在此循环中递增,直到p[i]!=press(0,1,0)。由于没有任何事情可以使p更长,或者为了测试我不大于p的长度,因此很容易看出索引如何超出范围。

答案 2 :(得分:0)

len返回长度,而不是最后一个索引。如果l = [1,2,3],则len(l)返回3,但l [3]超出范围。

所以你应该使用

while i<len(p)-1

或更好:

for i in range(len(p)):