(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!