繁体   English   中英

为什么我的代码会引发错误?

[英]Why does my code raise an error?

我正在进行编码练习:给定整数序列作为数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。

所以我写了这段代码:

def almostIncreasingSequence(sequence):
    first_list, second_list = sequence, sequence
    for i in range(len(sequence)-1):
        if sequence[i] >= sequence[i+1]:
            first_list.remove(sequence[i])
            second_list.remove(sequence[i+1])
            break

    if first_list == sorted(set(first_list)) or second_list == sorted(set(second_list)):
        return True
    else:
        return False

现在,这段代码似乎可以在大多数序列上运行,但是特别是这会引发错误:

print almostIncreasingSequence([1,3,2])

错误如下:

Traceback (most recent call last):
  file.py3 on line ?, in getUserOutputs
    userOutput = _runsppge(testInputs[i])
  file.py3 on line ?, in _runsppge
    return almostIncreasingSequence(*_fArgs_lujxeukjlbwc)
  file.py3 on line 7, in almostIncreasingSequence
    second_list.remove(sequence[i+1])
IndexError: list index out of range

我只是不明白列表索引怎么可能超出范围。有人知道吗?

由于您要从要迭代的同一列表中删除项目

for i in range(len(sequence)-1):
    if sequence[i] >= sequence[i+1]:
        first_list.remove(sequence[i])     #  <-- removing item
        second_list.remove(sequence[i+1])  #  <-- removing item
        break

并且,如注释中所述, first_list, second_list = sequence, sequence不会创建任何新列表。 first_list, second_list,sequence都在该行之后引用完全相同的列表对象。

EDITED

第一次删除后的列表( first_list.remove(sequence[i]) )少了一个元素,因此,如果此时i+1进入边缘,它将超出范围。

[1, 2, 3, 5, 4] 1,2,3,5,4]这样的列表。 i在元素5 (i是3)上时, if语句被触发,则首先删除( first_list.remove(sequence[i]) ),该语句之后,list有4个元素[1, 2, 3, 4] ,然后下一行尝试访问i+1second_list.remove(sequence[i+1]) )处的元素(元素4),因此它使(i为4) second_list.remove(sequence[i+1])

> c:\users\jeffrey\documents\github\wadi\example.py(4)almostIncreasingSequence()
      3     for i in range(len(sequence)-1):
----> 4         if sequence[i] >= sequence[i+1]:
      5             first_list.remove(sequence[i])

ipdb> next
> c:\users\jeffrey\documents\github\wadi\example.py(5)almostIncreasingSequence()
      4         if sequence[i] >= sequence[i+1]:
----> 5             first_list.remove(sequence[i])
      6             second_list.remove(sequence[i+1])

ipdb> first_list
[1, 3, 2]
ipdb> second_list
[1, 3, 2]
ipdb> next
> c:\users\jeffrey\documents\github\wadi\example.py(6)almostIncreasingSequence()
      5             first_list.remove(sequence[i])
----> 6             second_list.remove(sequence[i+1])
      7             break

ipdb> first_list
[1, 2]
ipdb> second_list
[1, 2]
ipdb>

即使我没有执行此行second_list.remove(sequence[i+1]) ,因为first_listsecond_list指向相同的位置。 换句话说,我们可以说一个是另一个的别名。 这样,如果可以更改,则second_list也将更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM