(1)删除列表元素引起的下标变化错误

演示代码:

x = list(range(10))
for i in range(len(x)):
    if x[i]%2 == 0:
        del x[i]

出错信息:

Traceback (most recent call last):
  File "C:\Python36\bar.py", line 3, in <module>
    if x[i]%2 == 0:
IndexError: list index out of range

出错原因分析:

Python列表在增加或删除元素时,会自动进行内存的扩展和收缩,从而保证元素连续。这会导致插入和删除位置之后的元素下标发生变化。上面的代码不仅会抛出异常,还会因为下标的变化而导致有些元素被跳过没有处理。例如:

x = list(range(10)) + [10]*3
for i in range(len(x)):
    print(x)
    if x[i]%2 == 0:
        del x[i]

运行结果为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10]
[1, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10]
[1, 3, 5, 6, 7, 8, 9, 10, 10, 10]
[1, 3, 5, 7, 8, 9, 10, 10, 10]
[1, 3, 5, 7, 9, 10, 10, 10]
[1, 3, 5, 7, 9, 10, 10]
[1, 3, 5, 7, 9, 10]
Traceback (most recent call last):
  File "C:\Python36\bar.py", line 4, in <module>
    if x[i]%2 == 0:
IndexError: list index out of range

解决方案:

在涉及列表部分元素删除之类的操作时,应从后往前删除,避免因为下标变化导致的问题。例如:

x = list(range(10)) + [10]*3
for i in range(len(x)-1, -1, -1):
    print(x)
    if x[i]%2 == 0:
        del x[i]
print(x)

运行结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 9]
[0, 1, 2, 3, 4, 5, 7, 9]
[0, 1, 2, 3, 4, 5, 7, 9]
[0, 1, 2, 3, 5, 7, 9]
[0, 1, 2, 3, 5, 7, 9]
[0, 1, 3, 5, 7, 9]
[0, 1, 3, 5, 7, 9]
[1, 3, 5, 7, 9]

(2)不可下标错误

演示代码:

>>> x = map(str, range(20))
>>> x[3]
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    x[3]
TypeError: 'map' object is not subscriptable
>>> x = enumerate('hello world')
>>> x[3]
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    x[3]
TypeError: 'enumerate' object is not subscriptable
>>> x = set(range(20))
>>> x[5]
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    x[5]
TypeError: 'set' object does not support indexing
>>> x = zip(range(5), range(5))
>>> x[3:5]
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    x[3:5]
TypeError: 'zip' object is not subscriptable

出错原因分析:

Python列表、元组、字符串等有序非惰性序列支持按位置随机访问,而字典、集合这样的无序序列不支持按位置随机访问其中的元素。map、zip、enumerate、filter、生成器对象等类似的有序、惰性对象只能按序访问,在前面的元素访问之前不支持按位置直接访问后面的元素,也不支持切片操作,并且已访问过的元素不可以再次访问。例如:

>>> x = map(str, range(20))
>>> next(x)
'0'
>>> next(x)
'1'
>>> '3' in x
True
>>> '3' in x
False
>>> '5' in x
False

---------相关阅读------------

Python编程常见出错信息及原因分析(3)

Python编程常见出错信息及原因分析(2)

Python编程常见出错信息及原因分析(1)

----------喜大普奔----------

1、继《Python程序设计基础》(2017年9月第5次印刷)、《Python程序设计(第2版)》(2017年9月第4次印刷)、《Python可以这样学》(2017年7月第3次印刷)系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版,并于2017年9月进行了第2次印刷。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3

2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:全国高校程序设计系列课程高级研修班(Python)通知

Python编程常见出错信息及原因分析(4)相关推荐

  1. Python编程常见出错信息及原因分析(5):安装扩展库

    本文主要介绍使用pip安装扩展库时常见的错误. (1)pip命令应该在命令提示符环境中执行,如果在Python开发环境中执行,则会出现下面的错误: (2)不存在要安装的扩展库,此时应仔细检查是否有拼写 ...

  2. Python编程常见出错信息及原因分析(3)

    (1)不可哈希错误 演示代码: >>> x = {[1], [2]} Traceback (most recent call last):   File "<pysh ...

  3. Python编程常见出错信息及原因分析(2)

    (1)缩进错误 演示代码: >>> if 5>3: print('5>3') SyntaxError: expected an indented block >&g ...

  4. Python编程常见出错信息及原因分析(1)

    1.被0除错误 演示代码: >>> 2 / 0 Traceback (most recent call last):   File "<pyshell#0>&q ...

  5. Python编程常见错误表现形式与原因分析

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),清华大学出版社,2020年6月第1次印刷,7月第3次印刷 京东购买链接:https://i ...

  6. Java常见异常类型及原因分析

    Java常见异常类型及原因分析 0x1 NullPointerException异常 顾名思义,NullPointerException 是空指针异常.但是在 Java 中没有指针,怎么会有 空指针异 ...

  7. 网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施

    网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施 最近在测试一个管理系统网站时,发现该网站在PC上运行一切正常,但在Ipad 上运行时,提示网页出现问题,需要重新提交表格,复新提交 ...

  8. 动易2005、2006版常见错误号的原因分析及解决方法

    错 误 号:432 错误描述:File name or class name not found during Automation operation 错误来源:PE_Common6 原因分析:服务 ...

  9. [转] 常见WinCE启动失败原因分析

    *********************************************** 一般情况下,为设计中的IC开发SW方案,难免会碰到Bootloader/EBoot/OS启动失败的情况, ...

最新文章

  1. php mysql 降_PHP,MySQL:mysql替代php in_array函数
  2. javascript中两个等号和三个等号的区别
  3. 停电造成的主板BIOS维修
  4. 关于批量插入数据之我见(100万级别的数据,mysql)
  5. python 日期 格式转换 英文_量化数据预处理-中文日期(含)转英文日期
  6. javascript判断日期奇偶_js中判断奇数或偶数
  7. JavaScript的DOM编程--01--js代码的写入位置
  8. ORACLE集群日志收集,【RAC】Oracle RAC集群环境下日志文件结构
  9. idea导入一个工程后只显示pom文件_P1搭建第一个springboot应用
  10. iOS相册权限、相机权限、麦克风权限
  11. SWUST OJ【972】
  12. 6-机器学习之KNN(K-近临算法)
  13. 大学生就业的三方协议基本概述
  14. 达梦数据库的表空间管理
  15. java中入参_JAVA传参
  16. 高通关闭插入USB后自动开机的解决方案
  17. 招生CRM系统|基于Springboot实现培训机构招生CRM管理系统
  18. 北斗定位,定位追踪,防盗追踪系统设计方案
  19. winsat查询windwos里disk、mem、cpu性能
  20. 华为在深度学习平台上的优化实践

热门文章

  1. 百度app不支持popstate_这一次谷歌很强硬,从现在起你的 App 再不支持,将拒绝上架!...
  2. springboot 文件服务器_spring boot还不了解?一份spring boot实战文档送给你
  3. matlab d=sqrt((i-m)^2+(j-n)^2);,硕士研究生《数字图像处理》作业
  4. android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...
  5. 判断 小程序_怎么判断小程序开发公司靠不靠谱?
  6. java 模拟post上传文件_JAVA模拟HTTP post请求上传文件
  7. Antd 多层Modal+Form组件嵌套 如何在父级组件中清空子级组件状态与数据?
  8. python的循环控制结构是什么_7.Python控制和循环结构
  9. apache2配置支持php7,Ubuntu14.04服务器环境下配置PHP7.0+Apache2+Mysql5.7的方法
  10. [******] 链表问题:将单向链表按某值划分成左边小、中间相等、右边大的形式...