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

原文转自:https://www.cnblogs.com/python-dd/p/9152687.html

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循环。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值