• 关于列表元素的删除


    在删除列表元素时,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

  • 相关阅读:
    loadrunne-- Analysis 分析器
    Fiddler抓包工具详细介绍
    在 Windows 10 x64 上安装及使用 ab 工具的流程
    Ab工具基本使用
    ab压测返回结果解析
    VMware Workstation 14 Pro永久激活密钥
    通用接口测试用例设计
    线段树の二 区间乘+区间加
    线段树の一 区间和
    C++位运算
  • 原文地址:https://www.cnblogs.com/chuangming/p/8458966.html
Copyright © 2020-2023  润新知