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

TypeError: 'list' object is not callable in python

我对python是个新手,并遵循一个教程。本教程中有一个list的示例:

1
example = list('easyhoss')

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

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

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


似乎您对内建名称list进行了隐藏,该名称指向的类与指向其实例的类同名。下面是一个例子:

1
2
3
4
5
6
>>> 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运行时会在本地命名空间中查找该名称(相对于引用而言),如果不存在该名称,则会在更高级别的命名空间中重复尝试。此过程将继续,直到没有更高的命名空间。在这种情况下,你会得到一个NameError。内置函数和类驻留在一个特殊的高阶命名空间__builtins__中。如果在模块的全局命名空间中声明一个名为list的变量,则解释器将永远不会在更高级别的命名空间(即__builtins__中)中搜索该名称。同样,假设您在模块中的函数内创建一个变量var,在模块中创建另一个变量var。然后,如果在函数内部引用var,则永远不会得到全局var,因为本地命名空间中有一个var-解释器不需要在其他地方搜索它。

  • 这是一个简单的例子。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        >>> 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/3846213。list是一个类,可以调用。调用类会触发实例构造和初始化。实例也可以调用,但list实例不可以调用。如果您对类和实例之间的区别感到更困惑,那么您可能需要阅读文档(非常方便,同一页涵盖了名称空间和范围)。

    如果你想了解更多关于内建,请阅读基督教院长的答案。

    附笔。

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


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

    什么是内置名称?

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

    从最新版本的python-3.6.2开始,目前有61个内置名称。可以在"文档"部分的"内置函数"中找到名称及其使用方法的完整列表。

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

    下面是一个使用dict内置的示例:

    1
    2
    3
    4
    >>> dict = {}
    >>> dict
    {}
    >>>

    如您所见,python允许我们分配dict名称来引用dictionary对象。

    "typeerror:'list'对象不可调用"是什么意思?

    简单地说,出现错误的原因是您在脚本中重新分配了内置名称list

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

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

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

    1
    myrange = list(range(1, 10))

    python引发了一个错误。错误显示"list"对象不可调用的原因是如上所述,名称list引用了一个list对象。因此,上述操作等同于:

    1
    [1, 2, 3, 4, 5](range(1, 10))

    这当然没有道理。不能调用列表对象。

    如何修复错误?

    假设您有如下代码:

    1
    2
    3
    4
    5
    6
    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')

    运行上述代码会产生以下错误:

    1
    2
    3
    Traceback (most recent call last):
      File"python", line 2, in <module>
    TypeError: 'list' object is not callable

    如果遇到类似的错误,如上面所说的"对象不可调用",则很可能在代码中使用了内置名称作为变量。在本例和其他情况下,修复方法与重命名有问题的变量一样简单。例如,要修复上述代码,我们可以将list变量重命名为ints

    1
    2
    3
    4
    5
    6
    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用户所犯的一个非常常见的错误。这就是为什么总是避免使用内置名称作为变量的原因,如strdictlistrange等。

    当您尝试使用内置名称作为变量时,许多linter和ide都会发出警告。如果你经常犯这样的错误,那么在这些项目中投资可能是值得的。

    我没有重命名内置名称,但仍然得到"typeerror:'list'对象不可调用"。给出了什么?

    上述错误的另一个常见原因是试图使用括号(()而不是方括号([]对列表进行索引)。例如:

    1
    2
    3
    4
    5
    6
    7
    >>> 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"对象。


    您可能在代码中为变量使用了内置名称"list"。如果您使用的是Jupyter笔记本,有时即使您将该变量的名称从"list"更改为其他值并重新运行该单元格,也可能会出现错误。在这种情况下,您需要重新启动内核。为了确保名称已更改,请在创建列表对象时单击单词"list",然后按shit+tab,并检查docstring是否将其显示为空列表。

    Used Built-in list name for my list

    Change my list name to my_list but still get error, Shift+Tab shows that list still hold the values of my_list

    Restart Kernal and it's all good


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

    1
    del list

    为什么出现TypeError: 'list' object is not callable

    说明:

    这是因为你以前把list定义为一个变量(我很确定),所以它将是一个列表,不再是函数,这就是为什么每个人都不应该命名变量函数,下面的内容与你现在所做的相同:

    1
    2
    3
    4
    5
    6
    >>> [1,2,3]()
    Traceback (most recent call last):
      File"<pyshell#0>", line 1, in <module>
        [1,2,3]()
    TypeError: 'list' object is not callable
    >>>

    所以你需要它作为list的默认函数,如何检测它是不是?只需使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> list
    <class 'list'>
    >>> list = [1,2,3]
    >>> list
    [1, 2, 3]
    >>> list()
    Traceback (most recent call last):
      File"<pyshell#4>", line 1, in <module>
        list()
    TypeError: 'list' object is not callable
    >>>

    如何检测变量名是否为函数?好吧,只需简单看看它是否有不同的颜色,或者使用如下代码:

    1
    2
    3
    4
    5
    >>> 'list' in dir(__builtins__)
    True
    >>> 'blah' in dir(__builtins__)
    False
    >>>

    在这之后,你应该知道为什么会出现TypeError: 'list' object is not callable

    好的,现在…

    如何修复此TypeError: 'list' object is not callable错误?

    代码:

    你要么做__builtins__.list()

    1
    2
    3
    4
    >>> list = [1,2,3]
    >>> __builtins__.list()
    []
    >>>

    或使用[]

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

    或从内存中删除list变量:

    1
    2
    3
    4
    5
    >>> list = [1,2,3]
    >>> del list
    >>> list()
    []
    >>>

    或者只需重命名变量:

    1
    2
    3
    4
    >>> lst = [1,2,3]
    >>> list()
    []
    >>>

    最后一个是最好的,我想是:—)

    有很多解决方案都有效。

    参考文献:

    'id' is a bad variable name in Python

    How do I use a keyword as a variable name?

    How to use reserved keyword as the name of variable in python?


    我得到这个错误的另一个原因是:

    我不小心在我的__init__中创建了一个空白列表,它与我试图调用的方法同名(我刚刚完成了一点重构,不再需要该变量,但在清理时遗漏了它)。因此,当我实例化类并尝试调用方法时,它认为我引用的是列表对象,而不是方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class DumbMistake:
        def __init__(self, k, v):
            self.k = k
            self.v = v
            self.update = []

        def update(self):
            // do updates to k, v, etc

    if __name__ == '__main__':
        DumbMistake().update('one,two,three', '1,2,3')

    所以它试图将这两个字符串赋给self.update[],而不是调用update()方法。删除了变量,所有变量都按预期工作。希望这能帮助别人。


    对我来说,它是一个flask服务器,返回一些videos数组(我希望是JSON格式的)。

    增加json.dumps(videos)解决了这个问题