python的list列表中的remove方法使用解析 - Python - 服务器之家

服务器之家

专注于服务器技术!
当前位置:首页 > 脚本编程 > Python

python的list列表中的remove方法使用解析

发布时间:2014-04-18 来源:服务器之家

这几天在用python写个小程序,发现一个很有意思的问题。
到时我的的情况是这样的,数组中存有函数返回的文件名,我要按照文件名读取其中的内容并在读取后删除(有文件名相同,后缀不同的文件,防止重复读取)。其中有六个文件,分两对(文件名相同),只要读取其中一个文件名,另一个就不用再读了,处理完以后直接从list中删除。

这个时候问题就来了,当我读取的时候总有两个文件名相同的文件读不出来。一直都在思考这个问题,也试验了挺多,后来终于发现了问题的所在。且听我慢慢道来。

回归现场:
假设a中存有a=['1','2','3']
这个三个元素。然后用for ……in ……的方式读取,正常是如下输入的,代码段1
>>> a=['1','2','3']
>>> for num in a:
  print a

  
['1', '2', '3']
['1', '2', '3']
['1', '2', '3']
>>> for num in a:
  print num

  
1
2
3
下面我要从循环打印出来,并删除打印出来的元素:代码段2
>>> for num in a:
  print num
  a.remove(num)

按理说这个应该和上面打印出来的是一致的,但事与愿违:代码段3
>>> for num in a:
  print num
  a.remove(num)

  
1
3
再打印a看看;代码段4
>>> print a
['2']
a里面居然还有元素?诧异吗?百思不得其解?

问题出现for in 和 remove 方法上:

for in循环是通过list中的下标有顺序的进行循环输出,这一点没有问题,循环一次下标就加一,以此类推。
remove方法呢?这个是问题的关键,它是怎么操作的呢?网上给的解答是删除第一次出现的该元素。也就是说它会按照元素进行查询,遇到的第一个匹配的就将其删除。问题是remove删除完元素以后list将会怎样?这个是问题的关键。下看:代码5
>>> b=['1','2']
>>> b.remove('1')
>>> print b
['2']
>>> print b[0]
2
应该看明白了,如果对list 使用remove方法,删除的元素位置会被后面的元素填补上。

回归到原来的问题上,a中有1,2,3三个元素,
第一次循环,remove掉了1,那么2填充了1的位置下标0,3填充了2的位置小标1,这个时候的key已经从零递增到1了。
所以第二次循环,输出的是a[1]这个位置,也就输出了3.
所以,最后print a 的时候却还能打印出一个2来。因为a[0]这个位置,在第一次访问后,就没再被访问了,所以也没有处理。a[0]就这样保存下来了。

热点推荐

    SQL Error: select * from ***_***_news where id in ()