【问题标题】:TypeError: 'list' object is not callable in pythonTypeError:'list'对象在python中不可调用
【发布时间】:2015-09-14 05:31:14
【问题描述】:

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

请告诉我哪里错了。我搜索了 SO this 但它不同。

【问题讨论】:

  • 某处您已将 一个实际的列表实例分配给名称 list,隐藏了内置; 不要那样做
  • 你给example赋值了吗?
  • @jonrsharpe 也许你应该详细说明一下? OP 可能不完全理解你写的内容
  • 试试print(list),看看你会得到什么。
  • @khanshah 有关键字。 list 不是其中之一。

标签: python list


【解决方案1】:

似乎您已经隐藏了指向同名类的内置名称 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)以避免此类错误。

您可能想知道什么是“可调用”,在这种情况下您可以阅读this postlist,作为一个类,是可调用的。调用类会触发实例构造和初始化。一个实例也可以是可调用的,但list 实例不是。如果您对类和实例之间的区别更加困惑,那么您可能需要阅读the documentation(非常方便,同一页面涵盖了命名空间和范围)。

如果您想了解更多关于内置函数的信息,请阅读Christian Dean 的回答。

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

【讨论】:

  • 那么,它有什么作用?列表是内置的。它应该可以正常工作。
  • @khanshah Python 非常灵活:您可以将内置函数重新分配给其他内容,例如这里。
  • 您始终可以使用__builtins__.list 检索原始内置。
  • @Evert 我已经进行了有问题的编辑。请帮帮我。
  • 非常感谢!哇,新手终究是新手!我犯了同样的错误,del(list) 命令解决了你指出的问题。非常感谢....我学到了一些新东西
【解决方案2】:

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

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

【讨论】:

  • 这里也一样。 SQLAlchemy 表查询的返回类型必须用 json.dumps 包装以消除此错误。
  • 你知道为什么吗?
【解决方案3】:

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

删除阴影
del list

【讨论】:

    【解决方案4】:

    您可能在代码中为变量使用了内置名称“list”。 如果您使用的是 Jupyter 笔记本,有时即使您将该变量的名称从“列表”更改为不同的名称并重新运行该单元格,您仍然可能会收到错误消息。在这种情况下,您需要重新启动内核。 为了确保名称已更改,请在创建列表对象时单击“列表”一词并按 Shift+Tab,然后检查 Docstring 是否显示它是一个空列表。

    【讨论】:

      【解决方案5】:

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

      什么是内置名称?

      在 Python 中,内置名称是 Python 解释器已分配预定义值的名称。该值可以是 functionclass 对象。无论范围如何,这些名称始终默认可用。分配给这些名称的一些值代表 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 用户常犯的错误。这就是为什么始终避免使用内置名称作为变量很重要的原因,例如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

      【讨论】:

        【解决方案6】:

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

        说明:

        因为你之前把list定义为一个变量(我很确定),所以它会是一个列表,而不是函数了,这就是为什么每个人都不应该命名变量函数,下面是一样的你现在在做什么:

        >>> [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的默认功能,如果是如何检测呢?只需使用:

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

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

        >>> 'list' in dir(__builtins__)
        True
        >>> 'blah' in dir(__builtins__)
        False
        >>> 
        

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

        好的,那么现在...

        如何解决这个TypeError: 'list' object is not callable 错误?

        代码:

        你必须要么做__builtins__.list():

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

        或者使用[]:

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

        或者从内存中删除list变量:

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

        或者只是重命名变量:

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

        【讨论】:

        • '这是因为你之前将列表定义为变量'对我有用!
        【解决方案7】:

        我收到此错误还有一个原因:

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

        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() 方法。删除了变量,一切都按预期工作。希望这对某人有所帮助。

        【讨论】:

        • 这是我在回答中一直在谈论的通用规则的一个很好的例子。虽然您的案例表面上看起来可能有所不同,但这仍然是名称阴影的问题,而不是在全球范围内。
        【解决方案8】:

        在周一早上的愚蠢错误联盟中,尝试访问列表中的项目时使用圆括号而不是方括号也会给您同样的错误消息:

        l=[1,2,3]
        
        print(l[2])#GOOD
        print(l(2))#BAD
        

        TypeError: 'list' 对象不可调用

        【讨论】:

        • 星期三早上发生在我身上!
        【解决方案9】:

        要解决这样的错误:"list object is not callable in python" 即使您正在更改变量名,如果您正在使用它,请在 Python Jutyter Notebook 中重新启动内核,或者只需重新启动 IDE

        我希望这会奏效。谢谢!!!

        【讨论】:

        • 这是否添加了超出Kevin's answer 的信息(以及拼写错误)?
        【解决方案10】:

        通过显示找出您分配给“列表”的内容

        >>> print(list)
        

        如果它有内容,你必须用它清理它

        >>> del list
        

        现在再次显示“列表”并期待这个

        <class 'list'>
        

        一旦你看到这个,你就可以继续你的副本了。

        【讨论】:

          【解决方案11】:

          使用 exit() 命令关闭当前解释器并重新输入 python 以开始您的工作。并且不要按字面意思将列表命名为列表。那你就没事了。

          【讨论】:

          • 请显示修复的代码示例。新用户可能无法理解您所说的“不要将列表命名为列表”
          【解决方案12】:

          您已经为列表分配了一个值。
          因此,当 list() 是变量时,您不能使用它。
          在您的计算机上按 Ctrl+F6 重新启动 shell 或 IDE。
          希望这也有效。

          【讨论】:

            猜你喜欢
            • 2021-03-31
            • 2012-04-21
            • 2014-06-13
            • 1970-01-01
            • 2019-04-02
            • 2021-03-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多