如果我们用最常用的方法使用for循环正向遍历列表元素进行删除,结果如下:
一、索引遍历列表循环删除:
运行结果报错:因为for语句中range()方法按照列表a的长度生成了有序整数序列,但在遍历过程中删除了列表元素,实际列表长度已发生改变,而遍历的序列仍是按原始列表的长度遍历的,导致索引超出范围
二、直接遍历列表元素循环删除(正向遍历):
运行结果:未按要求删除所有值为4的元素
因为当删除一个元素后该元素后面未遍历的元素均会向前移动一个位置,导致后面的元素索引值-1,下一个要遍历的元素移动到当前已遍历元素的位置,导致漏删。
正向遍历:删除过程中未遍历的元素索引位置不停在发生改变
循环删除列表所有元素的正确方法:
1、while循环删除:
2、反向遍历列表循环删除:
从列表末尾开始遍历元素时,删除一个元素后面的元素向前移动一个位置,但后面的元素已经遍历过了所以不会存在漏删的情况
总结:
1、不能通过索引遍历循环删除元素,因为删除元素后列表实际长度在发生改变;
2、通过直接遍历元素删除时,必须反向遍历删除,因为删除元素后,索引位置发生改变的是已遍历过的元素,对未遍的元素无影响,不存在漏删的情况;