循环删除列表中元素时千万别用正序遍历,一定要用反序遍历!
废话不多说,先上案例代码:
def test(data): for i in data: data.remove(i) return data data = [1, 2, 3] print(test(data))
面对以上代码,乍一看以为会打印出空列表,因为test函数内通过for的方法将data中的元素都删除了,其实不然,实际输出如下:
[2]
为什么会产生这种结果呢? 我们来深度剖析一下:
原列表在内存中为:
第一次执行到data.remove(i)时将第一个元素‘1’删除,列表变为:
第二次执行到data.remove(i)时i为第二个元素,即‘3’,此时将‘3’删除,列表变为:
此时列表已经没有第三个元素了,即退出循环,将[2]返回。
原因:Python的for循环本质上就是通过不断调用next()函数实现
如何解决这个问题呢? 我们可以用倒序删除的方法!
直接上代码:
def test(data): for i in data[:]: data.remove(i) return data data = [1, 2, 3] print(test(data))
此时再运行,发现输出结果为空列表
[]
因为data的变化不会影响data[:]中的内容
总结:迭代和修改 可迭代对象 不要同时进行