我有一个简单的脚本:
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
这个错误是什么意思?我为什么要这样做?我该如何解决?
答案 0 :(得分:17)
在完全理解错误的含义和解决方法之前,了解Python中的内置名称非常重要。
在Python中,内置名称是Python解释器已经分配了预定义值的名称。该值可以是函数或类对象。无论范围如何,这些名称在默认情况下始终可用。分配给这些名称的一些值代表Python语言的基本类型,而其他值则非常有用。
从最新版本的Python - 3.6.2开始 - 目前有 61 内置名称。可以在文档部分Built-in Functions中找到完整的名称列表及其使用方式。
需要注意的一点是, Python 不会阻止您重新 - 分配内置名称。内置名称不是保留的,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
变量重命名为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
等变量的重要原因。
当您尝试使用内置名称作为变量时,许多内核和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。
答案 1 :(得分:-1)
您已经覆盖了Python的内置方法list
。
mylist = [1, 2, 3, 4, 5] # just use any other name than `list`
答案 2 :(得分:-4)
这是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)
,其中expression
是X
类型的实例,此类型不支持用于函数调用语法。大多数时候你写这个是因为你认为expression
是一个函数或其他一些可调用的类型。