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),都是可以改变被赋值,从而改变了用法,所以,对于内置函数,如果进行赋值或改变用法,一定要小心,否则后面按原来的方法使用就会报错,这个错误查找也是比较麻烦的,一般不建议改变内置函数的用法或者赋值,而当做关键保留字使用。

物联沃分享整理
物联沃-IOTWORD物联网 » Python疑难杂症(6):TypeError报错解析及注意事项

发表评论