python列表操作,删除总是失败

昨天和今天,调试,怎么弄都出不来,其实很简单的需求,就是两个列表A和B ,A里面有2个值,B里边有5个值, 如果列表B中含有A的值,那么从列表B中踢出去,得到一个新B
代码如下

if uuids is not None and len(servers_list)!=0: for i, s in enumerate(servers_list): if not s['uuid'] in uuids: servers_list.remove(s)

看起来没有任何问题, 然而,最后的结果怎么都是3个元素,就是不是我想要的2个元素,我调啊,调啊,然后各种打印,都快吐血了。然后我用fori 去遍历,操作。
if uuids is not None and len(servers_list)!=0: for i in range(len(servers_list)): if not servers_list[i]['uuid'] in uuids: servers_list.remove(i)


报出来一个列表越界错误 ,然后我想起来一个问题,我是在操作同一个列表,然后呢,他的长度就不对了,肯定越界了。
然后我指定一个新的列表 = servers_list,然后操作新的列表,发现最后还是操作的servers_list. 反正是怎么都不对,各种打印,输出。
最后发现一个问题是,在利用enumerate的时候,总是最后一个值无法删除,条件判断是对的。然后就猜测一下, 最有可能他在遍历的时候这个 i 出现了问题。 然后加上索引i越界,明白了一个问题,从servers_list中根据对象删除 ,不是根据索引 i 删除的时候,我们应该做一个copy ,然后根据copy到的新的列表,去操作servers_list ,这样也不会有索引 i 越界的问题, 删除的时候也不会出现问题了。然后单元测试通过。
servers_list_iter = servers_list[:] if uuids is not None and len(servers_list) != 0: for i, s in enumerate(servers_list_iter): if not s['uuid'] in uuids: servers_list.remove(s)


【python列表操作,删除总是失败】python小白 今天犯了一个错误, 谨记!

    推荐阅读