zoukankan      html  css  js  c++  java
  • 关于列表元素的删除

    在删除列表元素时,Python 会自动对列表内存进行收缩,并移动列表元素,以保证元素之间没有空隙。每当插入或删除一个元素之后,该元素位置后面所有元素的索引就都改变了。以下代码说明这个问题。

    x = [1, 2, 1, 2, 1, 1, 1]
    
    for i in x:
        print(i)
        if i == 1:
            x.remove(i)
        print(x)
    
    #输出结果
    # 1
    # [2, 1, 2, 1, 1, 1]
    # 1
    # [2, 2, 1, 1, 1]
    # 1
    # [2, 2, 1, 1]
    # 1
    # [2, 2, 1]

    可见,由于 Python 的自动内存管理机制,通过这种方式并不能实现把 “1” 去除的效果。因此,我们下面试试切片的方法。

    x = [1, 2, 1, 2, 1, 1, 1]
    
    for i in x[::]:
        print(i)
        if i == 1:
            x.remove(i)
        print(x)
    
    #输出结果
    # 1
    # [2, 1, 2, 1, 1, 1]
    # 2
    # [2, 1, 2, 1, 1, 1]
    # 1
    # [2, 2, 1, 1, 1]
    # 2
    # [2, 2, 1, 1, 1]
    # 1
    # [2, 2, 1, 1]
    # 1
    # [2, 2, 1]
    # 1
    # [2, 2]

    可见,切片的方式可以实现把 “1” 去除的效果。可是,这又是为什么呢?下面我们通过以下代码来说明一下原因。

    x = [1, 2, 1, 2, 1, 1, 1]
    x1 = x[::]
    for i in x1:
        print(x1)
        print(id(x1))
        print(i)
        if i == 1:
            x.remove(i)
        print(x)
        print(id(x))
        print()
    
    #输出结果
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 1
    # [2, 1, 2, 1, 1, 1]
    # 2608486089864
    # 
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 2
    # [2, 1, 2, 1, 1, 1]
    # 2608486089864
    # 
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 1
    # [2, 2, 1, 1, 1]
    # 2608486089864
    # 
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 2
    # [2, 2, 1, 1, 1]
    # 2608486089864
    # 
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 1
    # [2, 2, 1, 1]
    # 2608486089864
    # 
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 1
    # [2, 2, 1]
    # 2608486089864
    # 
    # [1, 2, 1, 2, 1, 1, 1]
    # 2608486091208
    # 1
    # [2, 2]
    # 2608486089864

    由于在 for 循环中用的是同一个 x[::] ,因此我们用一个变量 x1 来接收它,然后再循环内部打印它的值和它的 id,发现它的值和 id 保持不变,也就是说,切片得到的 x[::] 在循环过程中保持不变,而且 x[::] 的 id 不同于 x 的 id,所以 x 变化并不会导致 x[::] 改变,因此可以实现去除 “1” 的效果。

    END

  • 相关阅读:
    Excel标题与索引的对应关系
    拼接LINQ动态表达式
    根据输入的模型属性表达式获取名称
    如何将页面的<br/>在Excel中正确换行
    针对VM从挂机-启动后,docker相关服务的无法使用问题!
    NIO(三):Selector选择器
    NIO(二):Channel通道
    Netty(一):netty的入门使用。
    设计模式(五):原型模式
    NIO(一):Buffer缓冲区
  • 原文地址:https://www.cnblogs.com/chuangming/p/8458966.html
Copyright © 2011-2022 走看看