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

kha*_*hah 43 python list

我是Python的新手并且遵循教程.list教程中有一个例子:

example = list('easyhoss')
Run Code Online (Sandbox Code Playgroud)

现在,在教程中,example= ['e','a',...,'s'].但在我的情况下,我得到以下错误:

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

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

Eli*_*igo 87

好像你已经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
Run Code Online (Sandbox Code Playgroud)

我相信这是相当明显的.Python在字典中存储对象名称(函数和类也是对象)(名称空间实现为字典),因此您可以在任何范围内重写几乎任何名称.它不会显示为某种错误.您最好使用IDE(例如PyCharm的免费版本或带有Python插件的Atom)来突出显示名称阴影.

编辑.感谢您的其他问题,我认为关于内置和范围的整个过程值得一些额外的报道.正如您可能知道的那样,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.
Run Code Online (Sandbox Code Playgroud)

所以,正如你所看到的,Python内置函数并没有什么特别之处.而你的案例仅仅是普遍规则的一个例子.

PS

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

  • 您始终可以使用`__builtins __.list`检索原始内置内容. (3认同)

use*_*754 15

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

del list
Run Code Online (Sandbox Code Playgroud)


Chr*_*ean 11

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

什么是内置名称?

在Python中,内置名称是Python解释程序已经分配了预定义值的名称。该值可以是函数对象。无论范围如何,这些名称始终默认为可用。分配给这些名称的某些值表示Python语言的基本类型,而其他一些则非常有用。

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

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

这是使用dict内置示例:

>>> dict = {}
>>> dict
{}
>>>
Run Code Online (Sandbox Code Playgroud)

如您所见,Python允许我们分配dict名称,以引用字典对象

“ TypeError:'列表'对象不可调用”是什么意思?

简而言之,发生错误的原因是因为您在脚本中重新分配内置名称 list

list = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

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

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

myrange = list(range(1, 10))
Run Code Online (Sandbox Code Playgroud)

Python引发了一个错误。错误显示“'列表'对象不可调用”的原因是,如上所述,该名称list是指列表对象。因此,上述操作等效于:

[1, 2, 3, 4, 5](range(1, 10))
Run Code Online (Sandbox Code Playgroud)

哪一个当然没有道理。您不能调用列表对象。

我该如何解决错误?

假设您有如下代码:

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')
Run Code Online (Sandbox Code Playgroud)

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

Traceback (most recent call last):
  File "python", line 2, in <module>
TypeError: 'list' object is not callable
Run Code Online (Sandbox Code Playgroud)

如果您遇到类似的错误,例如上面的错误提示“对象不可调用”,则很可能在代码中使用了内置名称作为变量。在这种情况下和其他情况下,解决方法就像重命名有问题的变量一样简单。例如,要修复以上代码,我们可以将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')
Run Code Online (Sandbox Code Playgroud)

PEP8-官方Python样式指南-包含有关命名变量的许多建议。

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

当您尝试使用内置名称作为变量时,许多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
Run Code Online (Sandbox Code Playgroud)

有关完整问题的说明以及解决该问题的方法,请参见TypeError:尝试访问list时不可调用'list'对象


Jor*_*ris 6

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

l=[1,2,3]

print(l[2])#GOOD
print(l(2))#BAD
Run Code Online (Sandbox Code Playgroud)

类型错误:“列表”对象不可调用

  • 发生在我身上,周三早上! (3认同)
  • 如果您像我一样在名称后使用括号,就像调用函数一样,也可能会发生这种情况。例如对于 myList() 中的 i: (2认同)

Kev*_*vin 5

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

为我的列表使用了内置列表名称

将我的列表名称更改为 my_list 但仍然出现错误,Shift+Tab 显示该列表仍然包含 my_list 的值

重新启动内核,一切都很好


归档时间:

查看次数:

159682 次

最近记录:

5 年,10 月 前