我是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
请告诉我哪里错了。我搜索了SO this,但情况有所不同。
答案 0 :(得分:80)
似乎你已经隐藏了指向类的内置名称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强调说&#34;特殊情况并不足以打破规则&#34;。你面临的问题背后有两条主要规则。
命名空间。 Python支持嵌套命名空间。从理论上讲,你可以无休止地嵌套命名空间。正如我已经提到的,名称空间基本上是名称字典和对相应对象的引用。您创建的任何模块都有自己的&#34;全局&#34;命名空间。事实上,它只是与该特定模块相关的本地命名空间。
作用域。当您引用名称时,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)来突出显示名称阴影以避免此类错误。
您可能想知道什么是&#34;可调用&#34;,在这种情况下,您可以阅读以下帖子:https://stackoverflow.com/a/111255/3846213。作为一个类的list
是可调用的。调用类会触发实例构造和初始化。实例也可以是可调用的,但list
实例不可调用。如果您对类和实例之间的区别更加困惑,那么您可能希望阅读the documentation(非常方便,同一页面涵盖命名空间和范围)。
如果您想了解更多有关内置组件的信息,请阅读Christian Dean的回答。
<强> P.S。强>
启动交互式Python会话时,您将创建一个临时模块。
答案 1 :(得分:7)
在您完全理解错误的含义以及如何解决之前,了解Python中的内置名称很重要。
在Python中,内置名称是 Python解释程序已经分配了预定义值的名称。该值可以是 function 或 class 对象。无论范围如何,这些名称始终默认为可用。分配给这些名称的某些值表示Python语言的基本类型,而其他一些则非常有用。
从Python的最新版本-3.6.2开始,当前有 61 个内置名称。名称的完整列表以及应如何使用它们,可以在文档部分Built-in Functions中找到。
但是要注意的重要一点是, Python 不会会阻止您 re 分配内置名称。内置名称不是保留名称,Python也允许将它们用作变量名称。
以下是使用内置dict
的示例:
>>> dict = {}
>>> dict
{}
>>>
如您所见,Python允许我们分配dict
名称,以便引用字典对象。
简而言之,发生错误的原因是因为您 重新分配 内置名称 list
脚本:
list = [1, 2, 3, 4, 5]
执行此操作时,您改写了内置名称的预定义值。这意味着您不能再使用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用户经常犯的错误。这就是为什么始终避免使用内置名称作为变量的原因,例如str
,dict
,list
,range
等。
当您尝试使用内置名称作为变量时,许多linter和IDE都会警告您。如果您经常犯此错误,则可能值得您花时间投资这些程序之一。
上述错误的另一个常见原因是尝试使用括号(()
)而不是方括号([]
)为列表编制索引。例如:
>>> 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 :(得分:2)
如果您处于交互式会话中并且不想重新启动,则可以使用
删除阴影del list
答案 3 :(得分:2)
您可能在代码中使用了内置名称“列表”作为变量。 如果您使用的是Jupyter笔记本,有时即使将变量的名称从“列表”更改为其他名称并重新运行该单元格,仍然可能会收到错误消息。在这种情况下,您需要重新启动内核。 为了确保名称已更改,请在创建列表对象时单击单词“列表”,然后按Shit + Tab,然后检查Docstring是否将其显示为空列表。
答案 4 :(得分:1)
require('@google-cloud/debug-agent').start({ allowExpressions:true});
出现?说明:
这是因为您之前将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()
[]
>>>
P.S。我猜最后一个是最可取的:-)
有很多可行的解决方案。
参考文献:
'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?
答案 5 :(得分:1)
由于另一个原因,我收到此错误:
我不小心在__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()方法。删除了变量,所有变量均按预期工作。希望这对某人有帮助。
答案 6 :(得分:0)
对我来说,这是一个烧瓶服务器返回一些videos
数组(我希望它是json格式..)
添加json.dumps(videos)
解决了此问题
答案 7 :(得分:0)
在愚蠢的星期一早晨错误联盟中,尝试访问列表中的项目时使用圆括号而不是方括号也会给您同样的错误消息:
l=[1,2,3]
print(l[2])#GOOD
print(l(2))#BAD
TypeError:“列表”对象不可调用
答案 8 :(得分:0)
通过显示找到分配给“列表”的内容
>>> print(list)
如果有内容,则必须使用
进行清理>>> del list
现在再次显示“列表”并期望它
<class 'list'>
看到此消息后,就可以继续进行复制。
答案 9 :(得分:0)
您已经为列表分配了一个值。
因此,当 list()
是变量时,您不能使用它。
在您的计算机上按 Ctrl+F6 重新启动 shell 或 IDE。
希望这也能奏效。
答案 10 :(得分:-1)
我将列表转换为字典,这解决了我的问题。
答案 11 :(得分:-1)
要解决此类错误:"list object is not callable in python"
,即使您正在更改变量名,如果正在使用,请在Python Jutyter Notebook中重新启动内核,或直接重新启动IDE 。
我希望这会起作用。谢谢!!!
答案 12 :(得分:-1)
使用exit()命令关闭当前的解释器,然后重新键入python以开始工作。并且不要从字面上将列表命名为列表。那你会没事的。