zoukankan      html  css  js  c++  java
  • python中循环删除列表中元素时的坑![转]

    原博文链接:https://www.cnblogs.com/baihualin/p/10698651.html

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

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

    复制代码
    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’删除,列表变为空列表!

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

  • 相关阅读:
    鲍尔默称微软将投入数十亿美元打造数据中心业务(转)
    程序流程的辅助控制
    获取程序所在目录
    越界赋值
    长字串与宽字串
    长字串与短字串
    指针的运算
    Windows API 的数据类型与 Delphi 数据类型对照表
    给动态数组添加一个元素
    Delphi 与 C/C++ 数据类型对照表
  • 原文地址:https://www.cnblogs.com/lilinyuan5474/p/11655582.html
Copyright © 2011-2022 走看看