TypeError: 'list' 对象在 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

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

原文由 khan shah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

好像你已经隐藏了内置名称 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 实例不是。如果您对类和实例之间的区别更加困惑,那么您可能需要阅读 文档(非常方便,同一页涵盖了名称空间和作用域)。

如果你想了解更多关于 builtins 的知识,请阅读 Christian Dean 的回答

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

原文由 Eli Korvigo 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

什么是内置名称?

在 Python 中,内置名称是 Python 解释器已经分配了预定义值 的名称。该值可以是 函数 对象。无论范围如何,这些名称在默认情况下始终可用。分配给这些名称的某些值代表 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’对象不可调用”的原因是因为如上所述,名称 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 用户常犯的错误。 This is why it’s important to always avoid using built-in names as variables such as str , dict , list , range , etc .

当您尝试使用内置名称作为变量时,许多 linter 和 IDE 会警告您。如果您经常犯这个错误,那么花时间投资这些程序之一可能是值得的。

我没有重命名内置名称,但我仍然收到“TypeError:’list’对象不可调用”。是什么赋予了?

导致上述错误的另一个常见原因是尝试使用圆括号 ( () ) 而不是方括号 ( [] ) 为列表编制索引。例如:

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

原文由 Christian Dean 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题