• python中循环删除列表中元素时的坑!


    循环删除列表中元素时千万别用正序遍历,一定要用反序遍历!

    废话不多说,先上案例代码:

    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]返回。

    如何解决这个问题呢? 我们可以用倒序删除的方法!

    直接上代码:

    def test(data):
        for i in data[::-1]:
            data.remove(i)
        return data
    
    
    data = [1, 2, 3]
    print(test(data))

    此时再运行,发现输出结果为空列表

    []

    倒序删除原理如下:

    原列表在内存中为:

    第一次执行到data.remove(i)时是将倒数第一个元素‘3’删除,列表变为:

    第二次执行到data.remove(i)时i为倒数第二个元素,即‘2’,此时将‘2’删除,列表变为:

    第三次执行到data.remove(i)时i为倒数第三个元素,即‘1’,此时将‘1’删除,列表变为空列表!

    总结:正序删除列表中元素时,被删元素后面的值会向前顶,然后导致漏删。倒序删除元素时,被删元素前面的值不会向后靠,所以可以完整的遍历到列表中所有的元素。

  • 相关阅读:
    商城----项目宏观(1)
    Java动态代理-JDK自带实现
    git提交出现remote rejected master -> XX changes closed
    openstack认证实践
    转一篇Git代码回滚技巧
    线段树解决leetcode307. Range Sum Query
    The Skyline Problem leetcode 详解
    编程容易犯错的几个地方
    c++中小项堆声明和使用
    C++中int转为char 以及int 转为string和string 转int和字符串的split
  • 原文地址:https://www.cnblogs.com/baihualin/p/10698651.html
Copyright © 2020-2023  润新知