繁体   English   中英

TypeError: 'list' object 在 python 中不可调用

[英]TypeError: 'list' object is not callable in python

我是 Python 的新手并遵循教程。 教程中有一个list示例:

example = list('easyhoss')

现在,在教程中, example= ['e','a',...,'s'] 但就我而言,我收到以下错误:

>>> example = list('easyhoss')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

请告诉我哪里错了。 我搜索了这个,但它是不同的。

似乎您已经隐藏了指向类的内置名称list ,该list的名称与指向其实例的名称相同。 下面是一个例子:

>>> example = list('easyhoss')  # here `list` refers to the builtin class
>>> list = list('abc')  # we create a variable `list` referencing an instance of `list`
>>> example = list('easyhoss')  # here `list` refers to the instance
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: 'list' object is not callable

我相信这是相当明显的。 Python 在命名空间(实现为字典)中存储对象名称(函数和类也是对象),因此您可以在任何范围内重写几乎任何名称。 它不会显示为某种错误。 您可能知道,Python 强调“特殊情况不足以打破规则”。 您所面临的问题背后有两个主要规则:

  1. 命名空间 Python 支持嵌套命名空间。 理论上,您可以无休止地嵌套命名空间。 正如我已经提到的,名称空间基本上是名称和对相应对象的引用的字典。 您创建的任何模块都有自己的“全局”命名空间。 事实上,它只是一个相对于该特定模块的本地命名空间。

  2. 范围 当您引用一个名称时,Python 运行时会在本地命名空间(相对于引用)中查找它,如果这样的名称不存在,它会在更高级别的命名空间中重复尝试。 这个过程一直持续到没有更高的命名空间为止。 在这种情况下,您会收到NameError 内置函数和类驻留在特殊的高阶命名空间__builtins__ 如果在模块的全局命名空间中声明了一个名为list的变量,解释器将永远不会在更高级别的命名空间(即__builtins__ )中搜索该名称。 类似地,假设您在模块中的函数内创建了一个变量var ,并在模块中创建了另一个变量var 然后,如果你在函数内部引用var ,你将永远不会得到全局var ,因为在本地命名空间中有一个var - 解释器不需要在其他地方搜索它。

这是一个简单的说明。

>>> example = list("abc")  # Works fine
>>> 
>>> # Creating name "list" in the global namespace of the module
>>> list = list("abc")
>>> 
>>> example = list("abc")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> # Python looks for "list" and finds it in the global namespace,
>>> # but it's not the proper "list".
>>> 
>>> # Let's remove "list" from the global namespace
>>> del list
>>> # Since there is no "list" in the global namespace of the module,
>>> # Python goes to a higher-level namespace to find the name. 
>>> example = list("abc")  # It works.

因此,如您所见,Python 内置函数并没有什么特别之处。 你的情况只是普遍规则的一个例子。 您最好使用突出显示名称阴影的 IDE(例如免费版本的 PyCharm,或带有 Python 插件的 Atom)以避免此类错误。

您可能想知道什么是“可调用”,在这种情况下,您可以阅读这篇文章 list ,作为一个类,是可调用的。 调用类会触发实例构建和初始化。 一个实例也可能是可调用的,但list实例不是。 如果您对类和实例之间的区别更加困惑,那么您可能需要阅读文档(非常方便,同一页面涵盖了名称空间和作用域)。

如果您想了解有关内置函数的更多信息,请阅读Christian Dean的回答。

PS当您启动交互式 Python 会话时,您会创建一个临时模块。

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

什么是内置名称?

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

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

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

这是使用内置dict的示例:

>>> dict = {}
>>> dict
{}
>>>

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

“TypeError:'list' 对象不可调用”是什么意思?

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

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

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

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

myrange = list(range(1, 10))

Python 引发了错误。 错误显示“'list' 对象不可调用”的原因是因为如上所述,名称list指的是一个列表对象。 所以上面的内容相当于做:

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

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

我该如何修复错误?

假设您有如下代码:

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

运行上面的代码会产生以下错误:

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

如果您遇到类似的错误,例如上面所说的“对象不可调用”,那么您很可能在代码中使用了内置名称作为变量。 在这种情况下和其他情况下,修复就像重命名有问题的变量一样简单 例如,要修复上面的代码,我们可以将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 try to access a list

如果您处于交互式会话中并且不想重新启动,则可以使用

del list

在星期一早上愚蠢的错误联盟中,尝试访问列表中的项目时使用圆括号而不是方括号也会给您相同的错误消息:

l=[1,2,3]

print(l[2])#GOOD
print(l(2))#BAD

类型错误:“列表”对象不可调用

您可能在代码中为变量使用了内置名称“list”。 如果您使用的是 Jupyter 笔记本,有时即使您将该变量的名称从“列表”更改为不同的名称并重新运行该单元格,您仍然可能会收到错误消息。 在这种情况下,您需要重新启动内核。 为了确保名称已更改,请在创建列表对象时单击“列表”一词并按Shift + Tab ,然后检查 Docstring 是否将其显示为空列表。

为我的列表使用了内置列表名称

将我的列表名称更改为 my_list 但仍然出现错误,Shift+Tab 显示该列表仍然包含 my_list 的值

重新启动内核,一切都很好

为什么会出现TypeError: 'list' object is not callable

解释:

这是因为你之前将list定义为一个变量(我很确定),所以它会是一个列表,而不是函数,这就是为什么每个人都不应该命名变量函数,下面和你正在做的一样现在:

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

所以你需要它是list的默认函数,如何检测它是否是? 只需使用:

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

如何检测变量名是否是函数? 好吧,只是简单地看看它是否有不同的颜色,或者使用如下代码:

>>> 'list' in dir(__builtins__)
True
>>> 'blah' in dir(__builtins__)
False
>>> 

之后,您应该知道为什么会出现TypeError: 'list' object is not callable

好的,那么现在...

如何修复此TypeError: 'list' object is not callable错误?

代码:

你要么做__builtins__.list()

>>> list = [1,2,3]
>>> __builtins__.list()
[]
>>> 

或使用[]

>>> list = [1,2,3]
>>> []
[]
>>> 

或者从内存中删除list变量:

>>> list = [1,2,3]
>>> del list
>>> list()
[]
>>> 

或者只是重命名变量:

>>> lst = [1,2,3]
>>> list()
[]
>>> 

PS 我猜最后一个是最可取的:-)

有一大堆有效的解决方案。

参考:

'id' 在 Python 中是一个错误的变量名

如何使用关键字作为变量名?

如何在python中使用保留关键字作为变量名?

通过显示来找出您分配给“列表”的内容

>>> print(list)

如果它有内容,你必须用

>>> del list

现在再次显示“列表”并期待这个

<class 'list'>

一旦你看到这个,你就可以继续你的副本。

对我来说,它是一个Flask 服务器返回一些videos数组(我希望它是 json 格式..)

添加json.dumps(videos)修复了这个问题

由于另一个原因,我收到此错误:

我不小心在我的__init__中创建了一个空白列表,它与我试图调用的方法同名(我刚刚完成了一点重构,不再需要该变量,但我在清理时错过了它)。 因此,当我实例化类并尝试调用该方法时,它认为我引用的是列表对象,而不是方法:

class DumbMistake:
    def __init__(self, k, v):
        self.k = k
        self.v = v
        self.update = []

    def update(self):
        // do updates to k, v, etc

if __name__ == '__main__':
    DumbMistake().update('one,two,three', '1,2,3')

所以它试图将两个字符串分配给 self.update[] 而不是调用 update() 方法。 删除了变量,一切都按预期工作。 希望这可以帮助某人。

您已经为列表分配了一个值。
所以,当它是一个变量时,你不能使用list()
通过在计算机上按Ctrl + F6重新启动 shell 或 IDE。
希望这也有效。

我发现自己遇到了这个错误,因为我有一个方法返回了一个我给了@property装饰器的列表。 我忘记了装饰器并且正在调用method()而不仅仅是给出同样错误的method

使用 exit() 命令关闭当前解释器并重新输入 python 以开始您的工作。 并且不要从字面上将列表命名为列表。 然后你会没事的。

我将列表转换为字典,这解决了我的问题。

要解决这样的错误: "list object is not callable in python"即使您正在更改变量名称,如果您正在使用它,请在 Python Jutyter Notebook 中重新启动内核,或者只需重新启动 IDE

我希望这会奏效。 谢谢!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM