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

(1)缩进错误

演示代码:

>>> if 5>3: print('5>3') SyntaxError: expected an indented block

>>> for i in range(5): print(i) SyntaxError: expected an indented block

错误原因分析与解决方案:

Python代码对缩进的要求非常严格,代码缩进层级决定了代码的所属关系。Python初学者最容易遇到的错误应该就是缩进错误,遇到这样的错误时,要仔细检查代码中的缩进是否与预定义的功能逻辑相符。

(2)成员访问错误

演示代码:

>>> x = [1, 2, 3] >>> x.add(4) Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> x.add(4) AttributeError: 'list' object has no attribute 'add'

>>> x = {1, 2, 3} >>> x.count(3) Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> x.count(3) AttributeError: 'set' object has no attribute 'count'

错误原因分析与解决方案:

错误信息显示当前对象并不具有一个叫做'***'的属性或方法,所以调用失败。这种错误一般是因为记错了对象属性或方法,也可能是前面某段代码代码修改了变量x的类型,自己却忘记了。遇到这种错误时,首先应使用type()函数确定当前位置的x是什么类型,然后可以在使用dir()确定该类型的对象是否具有'***'属性或方法。

(3)误用函数或方法返回值

演示代码:

>>> x = [1, 3, 2] >>> x = x.sort() >>> x.remove(3) Traceback (most recent call last): File "<pyshell#28>", line 1, in <module> x.remove(3) AttributeError: 'NoneType' object has no attribute 'remove'

错误原因分析与解决方案:

这种错误比较隐蔽一些,表面看上去好像是某个类型的对象不具有某某某属性,而实际上是函数或方法的误用。在Python中,如果函数或方法没有返回值,则认为其返回控制None。不过,这种错误又比较明显,因为一般是'NoneType' object has no attribute......,这里的'NoneType'是个很好的提示。遇到这种错误时,需要仔细检查出现问题的代码之前的函数调用或方法调用。

(4)试图删除或修改不可变容器对象中的元素值

演示代码:

>>> x = (1, 2, 3) >>> del x[1] Traceback (most recent call last): File "<pyshell#36>", line 1, in <module> del x[1] TypeError: 'tuple' object doesn't support item deletion >>> x[1] = 4 Traceback (most recent call last): File "<pyshell#37>", line 1, in <module> x[1] = 4 TypeError: 'tuple' object does not support item assignment

>>> x = 'hello world' >>> x[0] = 'w' Traceback (most recent call last): File "<pyshell#41>", line 1, in <module> x[0] = 'w' TypeError: 'str' object does not support item assignment

错误原因分析与解决方案:

在自己编写代码时,一般并不会发生这样的错误,因为作为Python程序员我们肯定知道元组和字符串是不可变的容易对象,是不允许修改其中元素值的,也不允许删除其中的元素。遇到这种错误时,一般是调用了其他函数或方法而不知道该函数或方法返回的是元组或字符串或其他不可变容易对象,应仔细检查出现错误的代码之前的函数或方法调用代码。

(5)下标或键错误

演示代码:

>>> x = {'a':97, 'b':98, 'C':67} >>> x['d'] Traceback (most recent call last): File "<pyshell#46>", line 1, in <module> x['d'] KeyError: 'd' >>> x = {1, 2, 3, 4} >>> x[2] Traceback (most recent call last): File "<pyshell#48>", line 1, in <module> x[2] TypeError: 'set' object does not support indexing

>>> x[0:3] Traceback (most recent call last): File "<pyshell#52>", line 1, in <module> x[0:3] TypeError: 'set' object is not subscriptable >>> x = [1, 2, 3, 4] >>> x[5] Traceback (most recent call last): File "<pyshell#50>", line 1, in <module> x[5] IndexError: list index out of range

错误原因分析与解决方案:

在Python中,列表、元组、字符串和range对象支持使用整数作为下标去访问指定位置上的元素值;列表支持使用整数作为下标去修改指定位置上的元素值;字典支持使用指定的键去访问或修改对应的值。当如果下标或键不存在则会抛出异常。集合不支持使用下标或键访问其中的元素。map、filter、enumerate、zip等对象也不支持使用下标访问其中的元素值。

(6)切片不连续错误

演示代码:

>>> x = list(range(6)) >>> x [0, 1, 2, 3, 4, 5] >>> x[::2] = [1] Traceback (most recent call last): File "<pyshell#58>", line 1, in <module> x[::2] = [1] ValueError: attempt to assign sequence of size 1 to extended slice of size 3

错误原因分析与解决方案:

在使用切片操作修改列表中元素值时,如果切片不连续(也就是abs(step)>1),则等号两侧必须含有同样多的元素数量。切片连续时并没有这个限制。

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法修养

pta 习题集 5-15 数组循环左移

本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(≥0≥0)个位...

36360
来自专栏五毛程序员

java反射机制入门02

35850
来自专栏orientlu

读 《C Traps and Pitfalls》Record

单引号实际代表一个整数 双引号代表指向无名数组的起始字符的指针(字符结尾 0) 使用库函数计算得到的字符串长度不包括结尾的0!

12230
来自专栏CodingToDie

Python学习(五):函数

第5 章 函数 Table of Contents 函数调用 数据类型转换 定义函数 空函数 返回多个值 tuple 函数调用 Python内置了很多有用的函数...

47250
来自专栏Coding迪斯尼

自制monkey语言编译器:符号系统与代码执行

9020
来自专栏我和未来有约会

Js中的变量

Js中的变量:  1:如果在var中没有初始化变量的值,则默认为undefined.  2:可以不用var来申明一个变量,但是在过程级中申明一个变量时,就必须用...

30460
来自专栏hbbliyong

python 函数参数的传递(参数带星号的说明)

python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个...

37980
来自专栏cs

python异常处理

22340
来自专栏老司机的技术博客

golang学习笔记9:函数参数与返回值

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Funct...

15620
来自专栏个人随笔

Java 中的异常处理机制

生活中的异常:  不能够完整而顺利的完成一些工作  根据不同的异常进行相应的处理,而不会就此终端我们的生活 引出:   异常处理:   方式:     ...

365100

扫码关注云+社区

领取腾讯云代金券