TypeError: 'list' object is not callable in python
我对python是个新手,并遵循一个教程。本教程中有一个
1 | example = list('easyhoss') |
现在,在教程中,
1 2 3 4 | >>> example = list('easyhoss') Traceback (most recent call last): File"<stdin>", line 1, in <module> TypeError: 'list' object is not callable |
请告诉我哪里错了。我搜索了这个,但它是不同的。
似乎您对内建名称
1 2 3 4 5 6 | >>> 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强调"特殊情况不足以打破规则"。你所面临的问题背后有两条主要规则。
命名空间。python支持嵌套的名称空间。理论上,您可以无限嵌套名称空间。正如我已经提到的,名称空间基本上是名称和对相应对象的引用的字典。您创建的任何模块都会得到自己的"全局"名称空间。实际上,它只是一个特定模块的本地名称空间。
范围。引用名称时,python运行时会在本地命名空间中查找该名称(相对于引用而言),如果不存在该名称,则会在更高级别的命名空间中重复尝试。此过程将继续,直到没有更高的命名空间。在这种情况下,你会得到一个
这是一个简单的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> 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的免费版本),以避免此类错误。
您可能还想知道什么是"可调用的",在这种情况下,您可以阅读以下文章:https://stackoverflow.com/a/111255/3846213。
如果你想了解更多关于内建,请阅读基督教院长的答案。
附笔。
当您启动一个交互式Python会话时,您将创建一个临时模块。
在完全理解错误的含义和解决方法之前,了解Python中的内置名称是什么很重要。
什么是内置名称?在python中,内置名称是python解释器已经分配了一个预定义值的名称。该值可以是函数或类对象。默认情况下,无论作用域是什么,这些名称都是可用的。分配给这些名称的一些值代表了Python语言的基本类型,而其他值则很简单。
从最新版本的python-3.6.2开始,目前有61个内置名称。可以在"文档"部分的"内置函数"中找到名称及其使用方法的完整列表。
但是,需要注意的一点是,Python不会阻止您重新分配内置名称。内置名称不被保留,python也允许将它们用作变量名。
下面是一个使用
1 2 3 4 | >>> dict = {} >>> dict {} >>> |
如您所见,python允许我们分配
简单地说,出现错误的原因是您在脚本中重新分配了内置名称
1 | list = [1, 2, 3, 4, 5] |
执行此操作时,会覆盖内置名称的预定义值。这意味着您不能再使用
因此,当您试图使用
1 | myrange = list(range(1, 10)) |
python引发了一个错误。错误显示"list"对象不可调用的原因是如上所述,名称
1 | [1, 2, 3, 4, 5](range(1, 10)) |
这当然没有道理。不能调用列表对象。
如何修复错误?假设您有如下代码:
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') |
运行上述代码会产生以下错误:
1 2 3 | Traceback (most recent call last): File"python", line 2, in <module> TypeError: 'list' object is not callable |
如果遇到类似的错误,如上面所说的"对象不可调用",则很可能在代码中使用了内置名称作为变量。在本例和其他情况下,修复方法与重命名有问题的变量一样简单。例如,要修复上述代码,我们可以将
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用户所犯的一个非常常见的错误。这就是为什么总是避免使用内置名称作为变量的原因,如
当您尝试使用内置名称作为变量时,许多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"对象。
您可能在代码中为变量使用了内置名称"list"。如果您使用的是Jupyter笔记本,有时即使您将该变量的名称从"list"更改为其他值并重新运行该单元格,也可能会出现错误。在这种情况下,您需要重新启动内核。为了确保名称已更改,请在创建列表对象时单击单词"list",然后按shit+tab,并检查docstring是否将其显示为空列表。
如果您在交互式会话中,不想重新启动,可以使用
1 | del list |
为什么出现
说明:
这是因为你以前把
1 2 3 4 5 6 | >>> [1,2,3]() Traceback (most recent call last): File"<pyshell#0>", line 1, in <module> [1,2,3]() TypeError: 'list' object is not callable >>> |
所以你需要它作为
1 2 3 4 5 6 7 8 9 10 11 | >>> 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 >>> |
如何检测变量名是否为函数?好吧,只需简单看看它是否有不同的颜色,或者使用如下代码:
1 2 3 4 5 | >>> 'list' in dir(__builtins__) True >>> 'blah' in dir(__builtins__) False >>> |
在这之后,你应该知道为什么会出现
好的,现在…
如何修复此代码:
你要么做
1 2 3 4 | >>> list = [1,2,3] >>> __builtins__.list() [] >>> |
或使用
1 2 3 4 | >>> list = [1,2,3] >>> [] [] >>> |
或从内存中删除
1 2 3 4 5 | >>> list = [1,2,3] >>> del list >>> list() [] >>> |
或者只需重命名变量:
1 2 3 4 | >>> lst = [1,2,3] >>> list() [] >>> |
最后一个是最好的,我想是:—)
有很多解决方案都有效。
参考文献:
'id' is a bad variable name in Python
How do I use a keyword as a variable name?
How to use reserved keyword as the name of variable in python?
我得到这个错误的另一个原因是:
我不小心在我的
1 2 3 4 5 6 7 8 9 10 11 | 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()方法。删除了变量,所有变量都按预期工作。希望这能帮助别人。
对我来说,它是一个flask服务器,返回一些
增加