当前位置: 首页 > 知识库问答 >
问题:

在Python中,列表对象是不可调用的

司马耘豪
2023-03-14

我是Python的新手,遵循教程。教程中有一个list的例子:

example = list('easyhoss')

现在,在教程中,示例=['e','a',…,'s']。但在我的例子中,我得到了以下错误:

>>> example = list('easyhoss')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

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

共有3个答案

皇甫繁
2023-03-14

如果您正在进行交互式会话,并且不想重新启动,则可以使用删除阴影

del list
艾俊悟
2023-03-14

在完全理解错误的含义以及如何解决之前,理解Python中的内置名称是很重要的。

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

截至Python的最新版本3.6.2,目前有61个内置名称。可以在“内置函数”的“文档”部分中找到完整的名称列表及其使用方法。

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

下面是使用内置的dict示例

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

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

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

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

执行此操作时,会重写内置名称的预定义值。这意味着您不能再使用预定义的list,它是一个表示Python列表的类对象。

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

myrange = list(range(1, 10))

Python引发了一个错误。错误显示“列表”对象不可调用的原因是,如上所述,名称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变量重命名为int

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

官方Python风格指南PEP8包含了许多关于命名变量的建议。

这是新老Python用户经常犯的错误。这就是为什么总是避免使用内置名称作为变量是很重要的,例如strdicslistrange等。

当您尝试使用内置名称作为变量时,许多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”对象在尝试访问列表时不可调用。

谢麒
2023-03-14

似乎您已经用指向类实例的相同名称隐藏了指向类的内置名称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强调“特殊情况不足以打破规则”。你所面临的问题背后有两条主要规则:

>

  • 名称空间。Python支持嵌套的名称空间。理论上,您可以无休止地嵌套名称空间。正如我已经提到的,名称空间基本上是名称字典和对相应对象的引用。您创建的任何模块都有自己的“全局”命名空间。事实上,它只是一个关于特定模块的本地名称空间。

    范围界定。引用名称时,Python运行时会在本地名称空间(相对于引用)中查找该名称,如果该名称不存在,则会在更高级别的名称空间中重复该尝试。此过程将继续,直到没有更高的名称空间。在这种情况下,您会得到一个名称错误。内置函数和类驻留在一个特殊的高阶名称空间\uuuuuuuu。如果在模块的全局名称空间中声明名为list的变量,解释器将永远不会在更高级别的名称空间(即\uuuuuuu内置项)中搜索该名称。类似地,假设您在模块中的函数内创建一个变量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实例不是。如果您对类和实例之间的区别感到更加困惑,那么您可能需要阅读留档(非常方便,同一页涵盖了名称空间和范围)。

    如果你想了解更多关于内置的信息,请阅读Christian Dean的答案。

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

  •  类似资料:
    • 问题内容: 我是Python的新手,并且正在学习教程。本教程中有一个示例: 现在,在教程中,。但就我而言,我得到以下错误: 问题答案: 好像你已经用指向类实例的相同名称遮盖了指向类的内置名称。这是一个例子: 我相信这是显而易见的。Python将对象名称(函数和类也是对象)存储在字典中(命名空间实现为字典),因此你可以在任何范围内重写几乎任何名称。它不会显示为某种错误。如你所知,Python强调“特

    • 问题内容: 我正在尝试使用flask在浏览器中显示已连接设备的列表。我在端口8000上启用了flask: 在server.py中: 在app.py中: 这是我的测试: 但我不断收到此错误: 在检查ttyUSB,…和其他设备是否存在时,我做错什么了吗? 问题答案: 问题在于您的端点正在返回列表。Flask只喜欢某些返回类型。可能最常见的两个是 一个对象 一个(与Python 2.x一起使用) 您还可

    • 问题内容: 我得到了这个,我期望它在打印x.withdraw()时能打印410。 这是我的代码: 我是否需要在类本身中修复某些问题,或者我的方法调用有问题? 问题答案: 您在实例上设置具有相同名称的属性: 您正在尝试调用的是该属性,而不是方法。Python不会区分方法和属性,它们也不位于单独的命名空间中。 为属性使用其他名称;(退出的过去时)作为更好的属性名称浮现在脑海: (我也纠正了一个错字;您

    • 我在Python27的这个小代码内容中遇到了这个错误。有人能帮我吗?提前谢谢。 运行时错误回溯(上次调用):文件“5EB4481881D651D6ECE1C375C80F5E509.py”,第57行,在print len(arr)TypeError中:“list”对象不可调用

    • 问题内容: 我有以下代码 当我运行它时,我得到了: 这是为什么?怎么修? 问题答案: 将变量称为。它掩盖了内置功能。

    • 问题内容: 码: 第一次工作,然后第二次出现错误: 有人知道为什么是这样吗? 我已经尝试过了,但出现错误: 问题答案: 这就是问题: 你正在重新定义什么意思。是字符串类型的内置Python名称,你不想更改它。 为本地变量使用其他名称,然后删除该语句。