初学者在python遍历序列同时删除相邻元素时的易错点

(1)问题的案例

以列表List为例

现在有一个列表,我想要遍历它,然后判断每个元素是否满足某个条件而需要被删除,如下面一段代码:

test = [11,22,33,44,55,66]

for temp in test:
    if temp == 22 or temp == 33:
        test.remove(temp)

我们理想的执行结果是:

[11,44,55,66]

但是实际执行结果却是:

[11,33,44,55,66]

(2)问题出现的原因

33没有被删除掉!这是因为 当 for 的光标 移动到22时 发现22满足条件需要被删除,那么就把22删除了,这时后面的33发现22被删除后留下了空位置就自动补位移动到了原先22的位置,但是光标却忽视了,光标没有管这个位置,直接跳向下一个,也就是指向了44。

这就是33没有没删除的原因。

这是一个非常危险的bug,实际开发中,如果应该被删除但是却被漏掉的垃圾会不断累积直到造成内存溢出。

(3)可行的解决方案

我的解决方案是,在一次遍历时,不删除,而是将不应该删除的元素,保存到一个中间变量中。

test = [11,22,33,44,55,66]
dataBackup = [] 

for temp in test:
    if temp != 22 and temp != 33:
        dataBackup.append(temp)

test = dataBackup

  以上OK!

 


 

展开阅读全文

没有更多推荐了,返回首页