关于python:我得到“TypeError:’list’对象不可调用”。

I'm getting “TypeError: 'list' object is not callable”. How do I fix this error?

本问题已经有最佳答案,请猛点这里访问。

我有一个简单的脚本:

1
2
3
4
5
6
list = [1, 2, 3, 4, 5]
myrange = list(range(1, 10))

for number in list:
    if number in myrange:
        print(number, 'is between 1 and 10')

但是,每当我尝试运行脚本时,python都会引发一个错误:

1
2
3
Traceback (most recent call last):
  File"python", line 2, in <module>
TypeError: 'list' object is not callable

这个错误是什么意思?我为什么要买?我该怎么修?


在完全理解错误的含义和解决方法之前,了解Python中的内置名称是什么很重要。

什么是内置名称?

在python中,内置名称是python解释器已经分配了一个预定义值的名称。该值可以是函数或类对象。默认情况下,无论作用域是什么,这些名称都是可用的。分配给这些名称的一些值代表了Python语言的基本类型,而其他值则很简单。

从最新版本的python-3.6.2开始,目前有61个内置名称。可以在"文档"部分的"内置函数"中找到名称及其使用方法的完整列表。

但是,需要注意的一点是,Python不会阻止您重新分配内置名称。内置名称不被保留,python也允许将它们用作变量名。

下面是一个使用dict内置的示例:

1
2
3
4
>>> dict = {}
>>> dict
{}
>>>

如您所见,python允许我们分配dict名称来引用dictionary对象。

"typeerror:'list'对象不可调用"是什么意思?

简单地说,出现错误的原因是您在脚本中重新分配了内置名称list

1
list = [1, 2, 3, 4, 5]

执行此操作时,会覆盖内置名称的预定义值。这意味着您不能再使用list的预定义值,该值是表示Python列表的类对象。

因此,当您试图使用list类从range对象创建新列表时:

1
myrange = list(range(1, 10))

python引发了一个错误。错误显示"list"对象不可调用的原因是如上所述,名称list引用了一个list对象。因此,上述操作等同于:

1
[1, 2, 3, 4, 5](range(1, 10))

这当然没有道理。不能调用列表对象。

如何修复错误?

如果遇到类似的错误,比如说"对象不可调用",那么很可能在代码中使用了内置名称作为变量。在这种情况下,修复程序与重命名有问题的变量一样简单。例如,要修复上述代码,我们可以将list变量重命名为ints

1
2
3
4
5
6
ints = [1, 2, 3, 4, 5] # Rename"list" to"ints"
myrange = list(range(1, 10))

for number in ints: # Renamed"list" to"ints"
    if number in myrange:
        print(number, 'is between 1 and 10')

官方的python风格指南pep8包含了许多关于命名变量的建议。

这是新的和旧的python用户所犯的一个非常常见的错误。这就是为什么总是避免使用内置名称作为变量的原因,如strdictlistrange等。

当您尝试使用内置名称作为变量时,许多linter和ide都会发出警告。如果你经常犯这样的错误,那么在这些项目中投资可能是值得的。

我没有重命名内置名称,但仍然得到"typeerror:'list'对象不可调用"。给出了什么?

上述错误的另一个常见原因是试图使用括号(()而不是方括号([]对列表进行索引)。例如:

1
2
3
4
5
6
7
>>> lst = [1, 2]
>>> lst(0)

Traceback (most recent call last):
  File"<pyshell#32>", line 1, in <module>
    lst(0)
TypeError: 'list' object is not callable

有关完整问题的解释以及如何修复该问题,请参阅typeerror:试图访问列表时,无法调用"list"对象。


您已经重写了Python的内置方法list

1
mylist = [1, 2, 3, 4, 5] # just use any other name than `list`


这是mcve!

1
2
3
4
>>> []()
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

也可以试试{}()()()。消息TypeError: 'X' object is not callable表示您编写了expression(some_arguments),其中expressionX类型的实例,并且此类型不支持在函数调用语法中使用。大多数时候,编写这个代码是因为您认为expression是一个函数或其他可调用类型。