之前发过一些坑,请参考Python编程中一定要注意的那些“坑”(一)和Python函数默认值参数的2个坑

今天说说列表的内存自动伸缩带来的坑。

假设有个列表如下,现在下删除其中的所有1,于是编写了如下代码

>>> x = [1, 2, 1, 2, 1, 2, 1, 2]
>>> for item in x:
       if item == 1:
           x.remove(item)

>>> x
[2, 2, 2, 2]

看上去完全正确,但实际上这段代码是有问题的,继续往下看

>>> x = [1, 2, 1, 2, 1, 1, 1, 1]
>>> for item in x:
        if item == 1:
             x.remove(item)

>>> x
[2, 2, 1, 1]

同样的代码,仅仅是要处理的列表发生了一点点变化,结果并没有删除所有的1,问题出在哪里呢?粗略一想,列表的remove()方法是删除参数的第一次出现,无法指定下标位置,是这个问题吗?看看下面的代码就知道了

>>> x = [1, 2, 1, 2, 1, 1, 1, 1]
>>> for i in range(len(x)):
       if x[i] == 1:
            del x[i]

Traceback (most recent call last):
  File "<pyshell#170>", line 2, in <module>
    if x[i] == 1:
IndexError: list index out of range
>>> x
[2, 2, 1, 1]

不但没有解决问题,反而引发了一个异常,下标越界。但这个异常似乎揭示了问题所在。下标越界,为什么会下标越界呢?难道是删除了列表中的元素导致元素个数减少并且影响了后续元素的索引?

>>> x = [1, 2, 1, 2, 1, 1, 1, 1]
>>> for i in range(len(x)):
       print(i, x)
       if x[i] == 1:
             del x[i]

0 [1, 2, 1, 2, 1, 1, 1, 1]
1 [2, 1, 2, 1, 1, 1, 1]
2 [2, 2, 1, 1, 1, 1]
3 [2, 2, 1, 1, 1]
4 [2, 2, 1, 1]
Traceback (most recent call last):
  File "<pyshell#177>", line 3, in <module>
    if x[i] == 1:
IndexError: list index out of range

好像真的是这个问题,为了更好地理解这个问题,看下面的代码

>>> x = [(0,1),(1,1),(2,1),(3,1),(4,1),(5,1)]
>>> for i in range(len(x)):
        print(i, x)
        if x[i][1] == 1:
              del x[i]

0 [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
1 [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
2 [(1, 1), (3, 1), (4, 1), (5, 1)]
3 [(1, 1), (3, 1), (5, 1)]
Traceback (most recent call last):
  File "<pyshell#183>", line 3, in <module>
    if x[i][1] == 1:
IndexError: list index out of range
>>> x
[(1, 1), (3, 1), (5, 1)]

好了,问题的原因已经确定了,那么正确的代码该怎么写呢?既然从列表中间位置删除元素会导致后面的元素索引发生改变,那么就从后往前删除好了。

>>> x = [1, 2, 1, 2, 1, 1, 1, 1]
>>> for i in range(len(x)-1, -1, -1):
        print(i, x)
        if x[i] == 1:
              del x[i]

7 [1, 2, 1, 2, 1, 1, 1, 1]
6 [1, 2, 1, 2, 1, 1, 1]
5 [1, 2, 1, 2, 1, 1]
4 [1, 2, 1, 2, 1]
3 [1, 2, 1, 2]
2 [1, 2, 1, 2]
1 [1, 2, 2]
0 [1, 2, 2]
>>> x
[2, 2]

Python编程中一定要注意的那些“坑”(二)相关推荐

  1. Python编程中一定要注意的那些“坑”(一)

    1  逗号不是运算符,只是个普通的分隔符 >>> x = 3, 5 >>> x (3, 5) >>> x == 3, 5 (False, 5) & ...

  2. python random模块中的指令_10分钟让你掌握python编程中random模块功能使用,非常详细...

    原标题:10分钟让你掌握python编程中random模块功能使用,非常详细 python作为一门高级编程语言,它的定位是优雅.明确和简单.阅读Python编写的代码感觉像在阅读英语一样,这让使用者可 ...

  3. python编程中常用的12种基础知识总结

    python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...

  4. python编程中的小问题汇总

    前言 本文记录了我在python编程中遇到的各种小问题,持续更新. 1. x = x + 1 VS x += 1 辨析下面这两段代码: >>> x = y = [1, 2, 3, 4 ...

  5. python的知识点运用_程序猿在Python编程中不得不使用的十二种基础知识

    Python编程中常用的12种基础知识,其中肯定有你不会的! 人生苦短,我用Python 1.正则表达式替换 目标: 将字符串line中的 overview.gif 替换成其他字符串. 人生苦短,我用 ...

  6. python编程中的运算_Python编程中的四大运算法则

    接触过编程的人都知道,编程中的数学知识无处不在,通过数学建模能够解决我们实际生活中的很多问题.当然这并不是说必须要成为一名数学大神才能学编程,但掌握数学知识在编程中的表达方法却是很有必要的,今天南京小 ...

  7. if __name__ == __main__:什么意思_秒懂Python编程中的if __name__ == 'main' 的作用和原理...

    来源:菜鸟分析 链接: https://zhuanlan.zhihu.com/p/34112508 一天偶然发现知乎上有篇关于对python编程中的if __name__ == 'main'的理解陈述 ...

  8. python编程基础知识点总结_【转载】Python编程中常用的12种基础知识总结

    Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...

  9. Python 编程中常用的12种基础知识总结

    Python 编程中常用的12 种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出 ...

最新文章

  1. jQuery如何动态删除TR,input按钮删除本行记录,checkbox全选反选
  2. 3.1 普通型生成函数
  3. Ribbon之ServerList
  4. flume spooldir bug修复
  5. 【小技巧】notepad++ 输入中文无响应
  6. php不判断比较大小,php怎么不分大小比较字符串
  7. c++ 航空管理系统_浅谈航站楼能源管理系统的设计与应用
  8. C++ 数据指针(-)
  9. 三段式状态机_FPGA笔试题——序列检测(FSM状态机)
  10. 编写易于调试的vc代码
  11. redis发布与订阅
  12. docker gogs安装
  13. SQL进阶教程PDF下载
  14. linux查看数据库实例名端口号,查看数据库tns配置
  15. ACDSee Photo Manager 15.0.169 crack by XenoCoder
  16. DOS BAT脚本批量打开Edge网页
  17. OpenCV提取图像中的垂直线(或者水平线)
  18. C语言入门基础_验证哥德巴赫猜想
  19. Java面试宝典2017版
  20. Nginx 配置上传文件大小限制

热门文章

  1. android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍
  2. php 显示html文件后缀,[求助]此jQuery在html后缀文件可用,在php后缀文件就用不了!...
  3. java m2文件放哪里_windows下打开.m2文件夹,没有找到setting.xml
  4. 差分进化算法python_差分进化算法DE-python实现
  5. c语言转职,魔兽地图:3C转职版5.0C
  6. 华为手机短息没有声音解决方案
  7. 手机通讯录备份代码实现三
  8. 基于JAVA+SpringMVC+MYSQL的在线商品拍卖网站
  9. python中MySQLdb模块用法实例
  10. Vue脚手架搭建简单步骤