Python疑难杂症(6):TypeError报错解析及注意事项
例如:python的报错信息如TypeError: 'float' object is not callable;TypeError: 'list' object is not callable等类似的报错信息“TypeError: '????' object is not callable”,这类的object is not callable错误,在实际应用中常常出现,但是错误又很隐蔽,查找起来比较困难,而网上搜到的答案都是就事论事,没有说出问题的实质内容,下面将对这类问题进行较全面的论述,起到举一反三的作用。
先解释一下这个问题的具体含义:XXX 不是一个 内置函数,意思是引用的位置对象并不是一个函数,但是被当做函数使用了。
举例1:
def a():
print("test")
return "ok"
… …
a="aa"
a
kk=a()
输出:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-29-9fd94aa867bc> in <module>
1 a="aa"
2 a
—-> 3 kk=a()
TypeError: 'str' object is not callable
举例2:
def a():
print("test")
return "ok"
a=5.6
s1=a()
print(s1)
输出:
TypeError Traceback (most recent call last)
<ipython-input-40-b2b73603b799> in <module>
4
5 a=5.6
—-> 6 s1=a()
7 print(s1)
TypeError: 'float' object is not callable
举例3:
a=["aa","bb"]
a
kk=a()
输出:
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-33-7e2c85bbb287> in <module>
1 a=["aa","bb"]
2 a
—-> 3 kk=a()
TypeError: 'list' object is not callable
上面举例1,aa定义了一个字符串,下面引用的时候被当做函数引用了。这种现象常常出现在前面已经定义了函数aa,而在下面的主程序过程中,aa又被赋值了字符串,再下面却又去引用前面的函数,所以报错。同理,举例2是因为函数定义后,后面又被付了浮点数据,再引用时当做函数使用,所以报错。 举例3,是因为赋值了列表,而又去作为函数引用,而报错
看下面的例子,涉及到了内置函数重新被赋值的问题,这个是大家经常犯的错误,尤其初学者。
前面有语句 list=[1,2,3,4,5,6,7,8],后面的使用如下:
a='welcome'
bb=list(a)
print(bb)
报错了:
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-44-922b6d2906fe> in <module>
1 a='welcome'
—-> 2 bb=list(a)
3 print(bb)
TypeError: 'list' object is not callable
本来这段语句是可以执行的,但是报错了,就是因为list在前面被赋值了:list=[1,2,3,4,5,6,7,8],list是一个内置函数,可以用来定义列表等,而list作为python的内置函数是可以被重新赋值而改变了用法,不像关键字如“if、 then、 True”等不能赋值。
Python中关键字有33个关键字,这33个是不能转换用法的,作为保留字使用。而68个内置函数(–版本3.6.2),都是可以改变被赋值,从而改变了用法,所以,对于内置函数,如果进行赋值或改变用法,一定要小心,否则后面按原来的方法使用就会报错,这个错误查找也是比较麻烦的,一般不建议改变内置函数的用法或者赋值,而当做关键保留字使用。