我收到“TypeError:'list' object is not callable”。如何修复此错误? [复制]

Posted

技术标签:

【中文标题】我收到“TypeError:\'list\' object is not callable”。如何修复此错误? [复制]【英文标题】:I'm getting "TypeError: 'list' object is not callable". How do I fix this error? [duplicate]我收到“TypeError:'list' object is not callable”。如何修复此错误? [复制] 【发布时间】:2018-01-26 04:02:16 【问题描述】:

我有一个简单的脚本:

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 都会引发错误:

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

这个错误是什么意思?为什么我会得到它?我该如何解决?

【问题讨论】:

确保您的问题首先出现在 google 中!很好的问答 我同意这是一个很好的错误案例,可以进行规范的问答。但我也认为您的回答应该提到可能导致相同错误消息的其他情况。像a=[1]; b=a(0) 这样的东西很常见,虽然我想我们可以将这种用法归类为错字... 现有的***.com/questions/31087111/…呢?第二个谷歌给我打了错误信息。 您不喜欢 答案 并不是制作自己的问答对的正当理由。如果 问题 不好(没有 MCVE 或类似问题)并且无法在不使现有答案失效的情况下进行编辑,那么我完全支持创建一个新的、更好的、规范的问答。但这不适用于answers。我们有一个投票系统,让社区决定哪个答案是最好的。如果你写一个更好的答案,你的最终会上升到顶部。通过创建您自己的问答,您将使人们为编写现有答案所付出的所有努力以及人们所投的所有选票都无效。 对了,我忘了说:这个问题是discussed on Meta。你可能想在那里发表你的理由。 【参考方案1】:

在您完全理解错误的含义以及如何解决之前,了解 Python 中的内置名称是什么很重要。

什么是内置名称?

在 Python 中,内置名称是 Python 解释器已分配预定义值的名称。该值可以是 functionclass 对象。无论范围如何,这些名称始终默认可用。分配给这些名称的一些值代表 Python 语言的基本类型,而另一些则简单有用。

截至最新版本的 Python - 3.6.2 - 目前有 61 个内置名称。可以在文档部分Built-in Functions 中找到完整的名称列表以及如何使用它们。

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

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

>>> dict = 
>>> dict

>>>

如您所见,Python 允许我们分配 dict 名称,以引用字典对象

“TypeError: 'list' object is not callable”是什么意思?

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

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

当您这样做时,您覆盖了内置名称的预定义值。这意味着您不能再使用 list 的预定义值,它是一个表示 Python 列表的类对象。

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

myrange = list(range(1, 10))

Python 引发错误。错误说“'list' object is not callable”的原因是因为如上所述,名称list 指的是一个列表对象。所以上面的内容相当于做:

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

这当然没有意义。您不能调用列表对象。

我该如何解决这个错误?

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

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')

PEP8 - 官方 Python 风格指南 - 包含许多关于命名变量的建议。

这是新老 Python 用户常犯的错误。这就是为什么始终避免使用内置名称作为变量很重要的原因,例如strdictlistrange 等。

当您尝试使用内置名称作为变量时,许多 linter 和 IDE 会警告您。如果您经常犯此错误,则值得您花时间投资其中一个程序。

我没有重命名内置名称,但我仍然收到“TypeError:'list' object is not callable”。什么给了?

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

>>> 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' object is not callable while trying to access a list。

【讨论】:

【参考方案2】:

这里是mcve!

>>> []()
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 是一个函数或其他一些可调用的类型。

【讨论】:

我不明白反对意见。我的回答解决了“如何解决错误?”部分。 Python 不禁止重新定义名称“列表”,但它拒绝调用列表类型的实例。出于所有实际调试目的,此答案有效。

以上是关于我收到“TypeError:'list' object is not callable”。如何修复此错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我收到“错误:React.Children.only 预计会收到一个 React 元素子项。”带有 TouchableWithoutFeedback

当我没有收到手动运行代码时,在 Python for 循环中收到 KeyError

尝试控制台时收到 401~UNAUTHORIZED。记录我从 socket.io 收到的消息

无效的字典 0 )。为啥我收到此错误?

为啥我收到远程通知时没有发送本地通知?

我收到以下异常[重复]