开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习。知识在于积累嘛!微笑+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误:
",line1,inf(t)TypeError:f()takesexactly2arguments(1given)【错误分析】不要误以为元祖里有两个参数,将元祖传进去就可以了,实际上元祖作为一个整体只是一个参数,实际需要两个参数,所以报错。必需再传一个参数方可.复制代码代码如下:>>>f(t,'var2')('a','b')var2更常用的用法:在前面加*,代表引用元祖复制代码代码如下:>>>f(*t)'a','b'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误:复制代码代码如下:>>>deffunc(y=2,x):returnx+ySyntaxError:non-defaultargumentfollowsdefaultargument【错误分析】在C++,Python中默认参数从左往右防止,而不是相反。这可能跟参数进栈顺序有关。复制代码代码如下:>>>deffunc(x,y=2):returnx+y>>>func(1)3+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误:
",line1,inD1['z']KeyError:'z'【错误分析】这是Python中字典键错误的提示,如果想让程序继续运行,可以用字典中的get方法,如果键存在,则获取该键对应的值,不存在的,返回None,也可打印提示信息.复制代码代码如下:>>>D1.get('z','KeyNotExist!')'KeyNotExist!'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误:
",line1,insqrt(4)TypeError:'int'objectisnotcallable【错误分析】exec语句最有用的地方在于动态地创建代码字符串,但里面存在的潜在的风险,它会执行其他地方的字符串,在CGI中更是如此!比如例子中的sqrt=1,从而改变了当前的命名空间,从math模块中导入的sqrt不再和函数名绑定而是成为了一个整数。要避免这种情况,可以通过增加in,其中就是起到放置代码字符串命名空间的字典。复制代码代码如下:>>>frommathimportsqrt>>>scope={}>>>exec"sqrt=1"inscope>>>sqrt(4)2.0+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误:复制代码代码如下:>>>seq=[1,2,3,4]>>>sep='+'>>>sep.join(seq)Traceback(mostrecentcalllast):File"",line1,insep.join(seq)TypeError:sequenceitem0:expectedstring,intfound【错误分析】join是split的逆方法,是非常重要的字符串方法,但不能用来连接整数型列表,所以需要改成:
错误:
【错误分析】因所用的Python版本2.7,比较高的版本,raise触发的异常,只能是自定义类异常,而不能是字符串。所以会报错,字符串改为自定义类,就可以了。
执行上面一段代码,错误如下:
【错误分析】Python中调用类的方法,必须与实例绑定,或者调用自身.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
",line1,inprintf(args)TypeError:f()takesexactly3arguments(1given)【错误分析】args是一个元祖,如果是f(args),那么元祖是作为一个整体作为一个参数*args,才是将元祖中的每个元素作为参数
【错误分析】错误原因**匹配并收集在字典中所有包含位置的参数,但传递进去的却是个元祖。所以修改传递参数如下:
【错误分析】在函数hider()内使用了内置变量open,但根据Python作用域规则LEGB的优先级:先是查找本地变量==》模块内的其他函数==》全局变量==》内置变量,查到了即停止查找。所以open在这里只是个字符串,不能作为打开文件来使用,所以报错,更改变量名即可。可以导入__builtin__模块看到所有内置变量:异常错误、和内置方法
",line1,inhash((1,2,(2,[3,4])))TypeError:unhashabletype:'list'【错误分析】字典中的键必须是不可变对象,如(整数,浮点数,字符串,元祖).可用hash()判断某个对象是否可哈希
【错误分析】列表属于可变对象,其append(),sort(),reverse()会在原处修改对象,不会有返回值,或者说返回值为空,所以要实现反转并排序,不能并行操作,要分开来写
【错误分析】class是Python保留字,Python保留字不能做变量名,可以用Class,或klass同样,保留字不能作为模块名来导入,比如说,有个and.py,但不能将其作为模块导入
【错误分析】错误原因,else,finally执行位置;正确的程序应该如下:
报错如下:
【错误分析】双下划线的类属性__secretCount不可访问,所以会报无此属性的错误.
解决办法如下:
【错误分析】Python不允许使用未赋值变量+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【错误分析】空元祖和空列表,没有索引为0的项+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【错误分析】一般出在代码缩进的问题+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【错误分析】如果文件里面没有行了会报这种异常
",line2,inAreturnA()RuntimeError:maximumrecursiondepthexceededclassBird:def__init__(self):self.hungry=Truedefeat(self):ifself.hungry:print"Ahaha..."self.hungry=Falseelse:print"No,Thanks!"该类定义鸟的基本功能吃,吃饱了就不再吃输出结果:复制代码代码如下:>>>b=Bird()>>>b.eat()Ahaha...>>>b.eat()No,Thanks!下面一个子类SingBird,复制代码代码如下:classSingBird(Bird):def__init__(self):self.sound='squawk'defsing(self):printself.sound输出结果:复制代码代码如下:>>>s=SingBird()>>>s.sing()squawkSingBird是Bird的子类,但如果调用Bird类的eat()方法时,
",line1,ins.eat()File"D:LearnPythonPerson.py",line42,ineatifself.hungry:AttributeError:SingBirdinstancehasnoattribute'hungry'【错误分析】代码错误很清晰,SingBird中初始化代码被重写,但没有任何初始化hungry的代码