我是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
请告诉我哪里错了。我搜了一下,但是不一样。
如果您正在交互会话中,不想重新启动,可以使用
在完全理解错误的含义和解决方法之前,了解Python中的内置名称很重要。
什么是内置名称?
在Python中,内置名称是Python解释器已经分配了预定义值的名称。值可以是函数或类对象。默认情况下,这些名称总是可用的,无论其作用域如何。分配给这些名称的一些值表示Python语言的基本类型,而其他一些值则非常有用。
最新版本的Python-3.6.2-目前有内置名称。在文档部分Built-in Functions中可以找到完整的名称列表以及如何使用它们。
但是,需要注意的一点是,Python不会阻止您分配内置名称。内置名称不是保留的,Python也允许它们用作变量名称。
下面是一个使用^{} 内置的示例:
如您所见,Python允许我们为引用dictionary对象指定
dict
名称。“TypeError:”list“object is not callable”是什么意思?
简单地说,发生错误的原因是您在脚本中重新分配了内置名:
当您这样做时,您重写了内置名称的预定义值。这意味着您不能再使用预定义的值
list
,这是一个表示Python list的类对象。因此,当您试图使用
list
类从range
对象创建新列表时:Python引发了一个错误。错误显示“list”对象不可调用的原因是,如上所述,名称
list
指的是list对象。因此,上述操作相当于:这当然没有道理。不能调用列表对象。
我怎样才能纠正这个错误?
假设您有如下代码:
运行上述代码会产生以下错误:
如果遇到类似的错误,如上面所说的“对象不可调用”,则很可能在代码中使用内置名称作为变量。在本例和其他情况下,修复方法与重命名有问题的变量一样简单。例如,要修复上述代码,可以将
list
变量重命名为ints
:PEP8-官方的Python风格指南-包括许多关于命名变量的建议。
这是新老Python用户犯的一个非常常见的错误。这就是为什么始终避免将内置名称用作变量(如
str
、dict
、list
、range
)等非常重要当您试图使用内置名称作为变量时,许多linter和ide都会发出警告。如果你经常犯这样的错误,也许值得你花时间投资其中一个项目。
我没有重命名内置名称,但仍得到“TypeError:”list“object is not callable”。给什么?
上述错误的另一个常见原因是试图使用括号(
()
)而不是方括号([]
)索引列表。例如:有关完整问题的解释以及如何解决该问题的方法,请参见TypeError: 'list' object is not callable while trying to access a list。
似乎您已将指向类的内置名称
list
用指向其实例的相同名称隐藏起来。下面是一个例子:我认为这是相当明显的。Python将对象名(函数和类也是对象)存储在字典中(名称空间实现为字典),因此可以重写任何范围内的几乎任何名称。它不会显示为某种错误。如您所知,Python强调“特殊情况不足以打破规则”。在你所面临的问题背后有两个主要的规则。
命名空间。Python支持嵌套的名称空间。理论上,您可以无限地嵌套名称空间。正如我已经提到的,名称空间基本上是名称字典和对相应对象的引用。您创建的任何模块都有自己的“全局”命名空间。事实上,它只是相对于特定模块的本地命名空间。
范围界定。当您引用一个名称时,Python运行时会在本地名称空间(相对于引用)中查找该名称,如果该名称不存在,则会在更高级别的名称空间中重复该尝试。此过程将继续,直到没有更高的名称空间。在这种情况下,会得到一个
NameError
。内置函数和类位于一个特殊的高阶名称空间__builtins__
。如果在模块的全局命名空间中声明名为list
的变量,解释器将永远不会在更高级别的命名空间(即__builtins__
)中搜索该名称。类似地,假设在模块中的函数中创建变量var
,在模块中创建另一个变量var
。然后,如果在函数中引用var
,就永远不会得到全局var
,因为在本地命名空间中有一个var
解释器不需要在其他地方搜索它。这是一个简单的例子。
所以,正如您所看到的,Python内置没有什么特别之处。你的案子只是一个普遍规则的例子。您最好使用一个突出显示名称阴影的IDE(例如PyCharm的免费版本或带有Python插件的Atom),以避免此类错误。
您可能还想知道什么是“可调用”,在这种情况下,您可以阅读以下文章:https://stackoverflow.com/a/111255/3846213。
list
作为一个类,是可调用的。调用类会触发实例构造和初始化。实例也可以是可调用的,但是list
实例不是。如果您对类和实例之间的区别更加困惑,那么您可能需要阅读the documentation(非常方便,同一页包含名称空间和作用域)。如果你想了解更多关于内建物的知识,请阅读Christian Dean的回答。
p.S.
当您启动交互式Python会话时,您将创建一个临时模块。
相关问题 更多 >
编程相关推荐