Python编程常见出错信息及原因分析(4)
(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)相关推荐
- Python编程常见出错信息及原因分析(5):安装扩展库
本文主要介绍使用pip安装扩展库时常见的错误. (1)pip命令应该在命令提示符环境中执行,如果在Python开发环境中执行,则会出现下面的错误: (2)不存在要安装的扩展库,此时应仔细检查是否有拼写 ...
- Python编程常见出错信息及原因分析(3)
(1)不可哈希错误 演示代码: >>> x = {[1], [2]} Traceback (most recent call last): File "<pysh ...
- Python编程常见出错信息及原因分析(2)
(1)缩进错误 演示代码: >>> if 5>3: print('5>3') SyntaxError: expected an indented block >&g ...
- Python编程常见出错信息及原因分析(1)
1.被0除错误 演示代码: >>> 2 / 0 Traceback (most recent call last): File "<pyshell#0>&q ...
- Python编程常见错误表现形式与原因分析
推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),清华大学出版社,2020年6月第1次印刷,7月第3次印刷 京东购买链接:https://i ...
- Java常见异常类型及原因分析
Java常见异常类型及原因分析 0x1 NullPointerException异常 顾名思义,NullPointerException 是空指针异常.但是在 Java 中没有指针,怎么会有 空指针异 ...
- 网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施
网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施 最近在测试一个管理系统网站时,发现该网站在PC上运行一切正常,但在Ipad 上运行时,提示网页出现问题,需要重新提交表格,复新提交 ...
- 动易2005、2006版常见错误号的原因分析及解决方法
错 误 号:432 错误描述:File name or class name not found during Automation operation 错误来源:PE_Common6 原因分析:服务 ...
- [转] 常见WinCE启动失败原因分析
*********************************************** 一般情况下,为设计中的IC开发SW方案,难免会碰到Bootloader/EBoot/OS启动失败的情况, ...
最新文章
- php mysql 降_PHP,MySQL:mysql替代php in_array函数
- javascript中两个等号和三个等号的区别
- 停电造成的主板BIOS维修
- 关于批量插入数据之我见(100万级别的数据,mysql)
- python 日期 格式转换 英文_量化数据预处理-中文日期(含)转英文日期
- javascript判断日期奇偶_js中判断奇数或偶数
- JavaScript的DOM编程--01--js代码的写入位置
- ORACLE集群日志收集,【RAC】Oracle RAC集群环境下日志文件结构
- idea导入一个工程后只显示pom文件_P1搭建第一个springboot应用
- iOS相册权限、相机权限、麦克风权限
- SWUST OJ【972】
- 6-机器学习之KNN(K-近临算法)
- 大学生就业的三方协议基本概述
- 达梦数据库的表空间管理
- java中入参_JAVA传参
- 高通关闭插入USB后自动开机的解决方案
- 招生CRM系统|基于Springboot实现培训机构招生CRM管理系统
- 北斗定位,定位追踪,防盗追踪系统设计方案
- winsat查询windwos里disk、mem、cpu性能
- 华为在深度学习平台上的优化实践
热门文章
- 百度app不支持popstate_这一次谷歌很强硬,从现在起你的 App 再不支持,将拒绝上架!...
- springboot 文件服务器_spring boot还不了解?一份spring boot实战文档送给你
- matlab d=sqrt((i-m)^2+(j-n)^2);,硕士研究生《数字图像处理》作业
- android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...
- 判断 小程序_怎么判断小程序开发公司靠不靠谱?
- java 模拟post上传文件_JAVA模拟HTTP post请求上传文件
- Antd 多层Modal+Form组件嵌套 如何在父级组件中清空子级组件状态与数据?
- python的循环控制结构是什么_7.Python控制和循环结构
- apache2配置支持php7,Ubuntu14.04服务器环境下配置PHP7.0+Apache2+Mysql5.7的方法
- [******] 链表问题:将单向链表按某值划分成左边小、中间相等、右边大的形式...