在您完全理解错误的含义以及如何解决之前,了解 Python 中的内置名称是什么很重要。
什么是内置名称?
在 Python 中,内置名称是 Python 解释器已分配预定义值的名称。该值可以是 function 或 class 对象。无论范围如何,这些名称始终默认可用。分配给这些名称的一些值代表 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 = [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 会警告您。如果您经常犯此错误,则值得您花时间投资其中一个程序。
我没有重命名内置名称,但我仍然收到“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。