TypeError:“list”对象在python中不可调用

2024-04-19 06:14:33 发布

您现在位置: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

请告诉我哪里错了。我搜了一下,但是不一样。


Tags: 示例mostexample错误stdin情况教程call
3条回答

如果您正在交互会话中,不想重新启动,可以使用

del list

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

什么是内置名称?

在Python中,内置名称是Python解释器已经分配了预定义值的名称。值可以是函数对象。默认情况下,这些名称总是可用的,无论其作用域如何。分配给这些名称的一些值表示Python语言的基本类型,而其他一些值则非常有用。

最新版本的Python-3.6.2-目前有内置名称。在文档部分Built-in Functions中可以找到完整的名称列表以及如何使用它们。

但是,需要注意的一点是,Python不会阻止您分配内置名称。内置名称不是保留的,Python也允许它们用作变量名称。

下面是一个使用^{}内置的示例:

>>> dict = {}
>>> dict
{}
>>>

如您所见,Python允许我们为引用dictionary对象指定dict名称。

“TypeError:”list“object is not callable”是什么意思?

简单地说,发生错误的原因是您在脚本中重新分配了内置名:

list = [1, 2, 3, 4, 5]

当您这样做时,您重写了内置名称的预定义值。这意味着您不能再使用预定义的值list,这是一个表示Python list的类对象。

因此,当您试图使用list类从range对象创建新列表时:

myrange = list(range(1, 10))

Python引发了一个错误。错误显示“list”对象不可调用的原因是,如上所述,名称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用户犯的一个非常常见的错误。这就是为什么始终避免将内置名称用作变量(如strdictlistrange)等非常重要

当您试图使用内置名称作为变量时,许多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

似乎您已将指向类的内置名称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解释器不需要在其他地方搜索它。

    1. 这是一个简单的例子。

          >>> 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/3846213list作为一个类,是可调用的。调用类会触发实例构造和初始化。实例也可以是可调用的,但是list实例不是。如果您对类和实例之间的区别更加困惑,那么您可能需要阅读the documentation(非常方便,同一页包含名称空间和作用域)。

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

      p.S.

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

相关问题 更多 >