Python——list列表操作一坑(remove)

问题发生背景:在一个对象被调用多次时候对象存入了列表暂时保存(主流程不能断开使用了while True),然后实例化了大批对象,具体你可参考打飞机游戏或者坦克大战发射子弹,每个子弹一个实例,创建的多到一定时候肯定是要释放的,然后我选择了在循环操作时候销毁了对象,结果发现很诡异的是对象总会跳过一部分没法销毁;

出问题代码:

#简单拿列表举例具体代码暂不粘贴
list_a = [11,22,33,44,55,66,77,88,99]
for num in list_a:
   #此处有其它操作使用num,此处拿print代替
   print(num)
   if num == 33 or num == 44:
       list_a.remove(num)

#猜测一下运行结果,很多人是不是觉得print()哪里可以调用到列表中所有数据,
#还有remove会回收列表中33和44成员,那你就太年轻了,请看结果:

Python——list列表操作一坑(remove)_第1张图片

意识到两个bug了没?循环后调用怎么没掉(虽然只是print操作代替的,你可以想象列表里存的如果是存钱或者投资的队列,是不是很惊喜),然后不是remove回收了吗?为啥44还躺在哪里,是不是很想象的结果不一样?

具体分析:

1、列表是有序的,在使用remove方法时候判断到索引2刚好等于33,然后代码让我删除,于是代码就删除了;此时执行完成列表是【11,22, ,44,55,66,77,88,99】;

2、索引位2不能是空吧,因为你没有append操作呀,原索引位3就填充了索引位2位置没意见吧,然后此时循环指针在索引位2要进入索引位3操作是不是但是请看执行索引位3循环时候列表是【11,22,44,55,66,77,88,99】;

3、于是第一个bug产生,print时候44哪去了,已经在索引位2了呀,循环说索引位2我已经操作过了,管他谁呢我要操作索引位3了,此时索引位3是55,于是print调用结果肯定就是:11,22,33,55,66,77,88,99 ——44顺利的被忽略了吧;

4、于是这就不难解释第二个bug了,因为你现在是第三索引位循环判断取得值都是55,你让我判断是不是等于33或者等于44,我做了没肯定是做了,索引位3是55(此时索引位2才是44,而且索引位2刚才已经判断过了凭啥让我做两次上边for循环都没搞,我才不干呢)此时顺利的保留了44在列表中,最终列表结果是:【11,22,44,55,66,77,88,99】最终给你了,此时拿到操作后数据是不是很郁闷;

解决思路推荐:

1、定义新的列表,不要在循环中对同一个列表中数据删除操作;

2、判断符合条件列表的数据添加到列表;

3、循环要删除元素列表,删除其它列表数据;

具体如下图:

Python——list列表操作一坑(remove)_第2张图片

至此问题顺利解决,只是一种思路推荐哈,有好的方法欢迎留言共同探讨;如有错误欢迎大佬指出,非常感谢;

你可能感兴趣的:(python)