• python列表删除元素及remove的奇怪现象


    先看一个例子:

    test1 = ['a','b','c','','']
    for
    i in test1: if i == '': test1.remove(i) #删除空元素 print(test1)

    >>>['a', 'b', 'c', '']

    这时发现并没有达到我们想要的结果,原因分析如下:

    要了解一下python列表的数据结构,列表属于连续线性表,它的连续在于有一块连续的内存储存着列表中元素的地址,如图(忽略地址与值所占的字节,只为方便举例子):

    当然也可以通过一个代码来看证明一下:

    a=[1,2,3]
    for i in a:
        print(id(i))
    >>>1514106336 #此地址即为左边的连续地址

    1514106368
       1514106400

    回到问题,当我们删除test1中的空字符时,test1 = ['a','b','c','',''],for in 是对下标进行操作,而remove是对值进行操作,当for到达索引为3,即第一个空字符位置时,
    符合条件即删除,后面的那个空字符的索引成为了3,此时对于for循环已经完成任务,故剩余一个空字符。
    还有一个简单的小例子:
    a=[1,2,3]
    for i in a:
        print(i,id(i))
    print("------------------")
    for i in a:
        if i==1:
            a.remove(i)
        print(i,id(i))
    print("------------------")
    print(a)
    >>>
    1 1380150752
    2 1380150784
    3 1380150816
    ------------------
    1 1380150752
    3 1380150816
    ------------------
    [2, 3]
    
    

    在列表中遍历,当元素值为1时删除此元素,然后打印,我们得到的输出结果是打印1和3,这和上面那个道理是一样的,删除1后,2会取代1的位置,3取代2的位置,所以就第二次遍历就输出3了,

    python中一切皆对象,i是一个临时变量,删除了元素1后还可以输出i的值及地址,数组元素的移除和i没有关系。

     
    列表有三种删除元素方式,del,remove,pop,其中del是python的一个方法不是列表所特有,pop()参数为元素的索引,remove()参数是想要删除的值

    用一下del看看会出现什么结果:
    a=[1,2,3]
    for i in a:
        if i==2:
            del i
            print(id(i))
    #报错 NameError: name 'i' is not defined
    a=[1,2,3]
    for i in a:
        if i==2:
            del i #del是解除引用,python中一切皆引用
        try:
             print(id(i))
        except NameError:
            pass
    a删除前地址1927704032   
          1927704064           
           1927704096
    删除后输出 1927704032
      
    1927704096
    
    

    对比地址的变化,可以得知del删除了该元素内存地址引用,所以报了错,与remove对比。

    删除列表中的空元素有这两种方法:

    #第一种
    test2 = ['a','','b','','c','','']
    while '' in test2:
        test2.remove('')
    print(test2)
    >>>['a', 'b', 'c']
    #第二种
    test2_new = [i for i in test2 if i != ''] #生成一个新的列表

    即删除列表中指定元素建议使用上述两种方法,不要用for循环。

    上面记录是写代码时踩的坑,有不严谨或者错误的地方期望大家指正。

    个人公众号,关注即可获得作者精选的python学习资料,pycharm注册码。

  • 相关阅读:
    ORA-12520: TNS:监听程序无法为请求的服务器类型找到可用的处理程序解
    Django2.1.2创建默认管理后台
    堡垒机实例以及数据库操作
    pycharm常用快捷键
    Linux命令之sftp
    oracle收集ash和awr性能报告方法
    linux-php5.6-安装sftp扩展
    linux系统安全设置策略
    Openssh版本升级修复漏洞
    Android Studio下HierarchyViewer的使用
  • 原文地址:https://www.cnblogs.com/python-dd/p/9152687.html
Copyright © 2020-2023  润新知