python循环删除列表中的元素时遇到的坑

今天在写测试用例的时候,突然想到之前刚学python时,做过一个循环删除列表中元素的练习题,现在把当时踩的坑总结一下,希望能对大家有所帮助。

具体的场景是这样的:

 我当时第一次是这么写的:

这种写法看起来并没什么问题,得到的应该是一个空的列表,其实不然,运行后的结果是这个样子的:

 

 咦?到底是哪里出了问题呢,其实只要去了解一下 for 循环的底层原理,就很容易明白:

data 这个列表在内存中是这样存储的:

 当第一次执行 for 循环时,默认删除索引为1 的元素,即删除 “卖茶叶”,删除后的列表是:

扫描二维码关注公众号,回复: 11140475 查看本文章

 当第二次执行 for 循环时,index +1,即删除索引为2 的元素,注意:这时 的 data 已经发生了变化,此时索引为 2 的元素不是“卖面膜” 而是 “卖保险”,删除后的列表是:

 当第三次执行 for循环时,index 在 2的基础上再加1,即删除索引为3,从上面的列表中我们可以看到,索引为 3 的元素是“卖手机”,删除后的列表是:

 第四次执行for 循环时,index 在3的基础上加1,即删除索引为4的元素,而这时的列表只有两个元素了,无法找到索引为4 的元素,即无法执行删除操作,所以会将列表直接打印出来。

那么,重点来了,怎么解决这个问题呢,仔细想一下,正序删除列表时由于每次删除一个元素后,后面的元素会顶上来,所以导致删不干净,如果我们倒序删除呢,我们来试一下子:

 这次再运行后的结果是:

 竟然真的删掉了,我们再来详细看一下它的原理:

data 这个列表在内存中是这样存储的:

第一次执行 for 循环时,由于是倒序所以会默认删除最后一个元素,即“卖手机”,删除后的列表是:

 后面会以此类推,直到把整个列表清空。

最后,总结一下,在使用for 循环遍历删除列表中的元素时,一定不要用正序去遍历,用反序遍历才能达到将列表中的元素清空。

最后的最后,再为大家奉上几种其他的方法,也可以达到遍历删除列表中元素的效果哦!

方法一:注意:pop() 函数默认是删除列表的最后一个元素哦

 方法二:

哪怕是最没有希望的事情,只要有一个勇敢者去坚持做,到最后就会拥有希望。

猜你喜欢

转载自www.cnblogs.com/Cactus-xiaot/p/12783734.html