17新手常见的Python运行时错误下面是一些导致程序崩溃的常见运行时错误的列表。1)忘记在if,elif,else,for,while,class,def声明的末尾添加:(导致“SyntaxError:invalidsyntax”)类似下面的代码会出现这个错误:ifspam==42print('Hello!')2)使用=而不是==(导致“SyntaxError:invalidsyntax”)=是赋值运算符,==是相等比较运算符。错误发生在以下代码中:ifspam=42:print('Hello!')3)错误使用缩进。(导致“IndentationError:unexpectedindent”、“IndentationError:unindentdoesnotmatchanyouterindetationlevel”和“IndentationError:expectedanindentedblock”)请记住,缩进增加仅在以:结尾的语句之后使用,并且必须在之后恢复到以前的缩进格式。错误出现在以下代码中:print('Hello!')print('Howdy!')or:ifspam==42:print('Hello!')print('Howdy!')or:ifspam==42:print('Hello!')4)忘记在for循环语句中调用len()(导致“TypeError:'list'objectcannotbeinterpretedasaninteger”)通常你想遍历列表的元素或stringbyindex,这需要调用range()函数。请记住返回len值而不是返回列表。错误出现在以下代码中:spam=['cat','dog','mouse']foriinrange(spam):print(spam[i])5)试图修改字符串的值(导致“TypeError:'str'objectdoesnotsupportitemassignment")string是一个不可变的数据类型,这个错误出现在下面的代码中:spam='Ihaveapetcat.'spam[13]='r'print(spam)而你实际上是想这样做:spam='Ihaveapetcat.'spam=spam[:13]+'r'+spam[14:]print(spam)6)尝试将非字符串值与字符串连接(导致“TypeError:Can'tconvert'int'objecttostrimplicitly")以下代码中会出现此错误:numEggs=12print('Ihave'+numEggs+'eggs.')而您实际上想这样做:numEggs=12print('Ihave'+str(numEggs)+'eggs.')or:numEggs=12print('Ihave%seggs.'%(numEggs))7)忘记在字符串的开头和结尾添加引号(导致“SyntaxError:EOLwhilescanningstringliteral")这个错误出现在以下代码中:print(Hello!')or:print('Hello!)or:myName='Al'print('Mynameis'+myName+.Howareyou?')8)变量或函数名称拼写错误(导致“NameError:name'fooba'isnotdefined”)该错误出现在以下代码中:foobar='Al'print('Mynameis'+fooba)or:spam=ruond(4.2)or:spam=Round(4.2)9)方法名拼写错误(导致“AttributeError:'str'objecthasnoattribute'lowerr'")错误发生在以下代码中:spam='THISISINLOWERCASE.'spam=spam.lowerr()10)referenceexceedsthelist***index(resultingin"IndexError:listindexoutofrange")代码中出现这样的错误:spam=['cat','dog','mouse']print(spam[6])11)usingadictionarykeythatdoesn'texist(resultingin"KeyError:'spam'")错误出现在以下代码中:spam={'cat':'Zophie','dog':'Basil','mouse':'Whiskers'}print('Thenameofmypetzebrais'+spam['zebra'])12)尝试使用Python关键字作为变量名(导致“SyntaxError:invalidsyntax”)Python关键字不能作为变量名,错误出现在这样的代码中:class='algebra'Python3的关键字是:and,as,assert,break,class,continue,def,del,elif,else,except,False,finally,for,from,global,if,import,in,is,lambda,None,nonlocal,not,or,pass,raise,return,True,try,while,with,yield13)在定义中使用增量运算符一个新变量(导致“NameError:name'foobar'isnotdefined”)不要使用0或空字符串作为声明变量时的初始值,使得使用自增运算符的spam+=1这句等于spam=spam+1,也就是说spam需要指定一个有效的初始值错误出现在以下代码中:spam=0spam+=42eggs+=4214)在定义局部变量之前在函数中使用局部变量(此时存在与局部变量同名的全局变量)(导致“UnboundLocalError:localvariable'foobar'referencedbeforeassignment")在一个函数中使用一个局部变量并且同时有一个同名的全局变量时会非常复杂。使用规则是:如果在函数中定义了任何东西,如果它只在函数中使用那么它是局部的,否则它是一个全局变量。这意味着您不能在定义它之前将其用作函数中的全局变量。错误发生在这样的代码中:someVar=42defmyFunction():print(someVar)someVar=100myFunction()15)tryingtouserange()tocreatealistofintegers(resultingin"TypeError:'range'objectdoesnotsupportitemassignment"),有时你想得到一个有序的整数列表,所以range()似乎是生成这个列表的好方法。但是,您需要记住range()返回一个“范围对象”,而不是实际的值列表。错误出现在下面的代码中:spam=range(10)spam[4]=-1也许这就是你想要做的:spam=list(range(10))spam[4]=-1(注意:在Python2,spam=range(10)有效,因为range()在Python2中返回一个列表值,但在Python3中会产生上述错误16)在++或—自动递增和自动递减中不错操作员。(导致“SyntaxError:invalidsyntax”)如果你习惯了其他语言,如C++、Java、PHP等,也许你会想尝试使用++或—来递增和递减一个变量。Python中没有这样的运算符。错误出现在下面的代码中:spam=1spam++也许这就是你想要做的:spam=1spam+=117)忘记在方法的第一个参数中添加self参数(导致“TypeError:myMethod()takesnoarguments(1given)")错误出现在以下代码中:classFoo():defmyMethod():print('Hello!')a=Foo()a.myMethod()
