我是 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
请告诉我哪里错了。我搜索 了这个,但它是不同的。
原文由 khan shah 发布,翻译遵循 CC BY-SA 4.0 许可协议
好像你已经隐藏了内置名称
list
, 它指向一个类,用相同的名称指向它的一个实例。这是一个例子:我相信这是相当明显的。 Python 将对象名称(函数和类也是对象)存储在名称空间(作为字典实现)中,因此您可以在任何范围内重写几乎任何名称。它不会显示为某种错误。您可能知道,Python 强调“特殊情况不足以破坏规则”。您遇到的问题背后有两个主要规则:
_命名空间_。 Python 支持嵌套的命名空间。理论上你可以无限地嵌套它们。正如我已经提到的,它们基本上是名称字典和对相应对象的引用。您创建的任何模块都有自己的“全局”名称空间,尽管实际上它只是与该特定模块相关的本地名称空间。
_范围界定_。当您引用一个名称时,Python 运行时会在本地命名空间(相对于引用)中查找它,如果该名称不存在,它会在更高级别的命名空间中重复尝试。这个过程一直持续到没有更高的命名空间为止。在这种情况下,您会得到一个
NameError
。内置函数和类驻留在特殊的高阶命名空间__builtins__
中。如果您在模块的全局命名空间中声明了一个名为list
的变量,解释器将永远不会在更高级别的命名空间(即__builtins__
)中搜索该名称。同样,假设您在模块的一个函数内创建了一个变量var
,并在模块中创建了另一个变量var
。然后,如果您在函数内部引用var
,您将永远不会获得全局var
,因为有一个var
没有本地名称空间- 解释器-需要在别处搜索它。这是一个简单的例子。
因此,如您所见,Python 内置函数没有什么特别之处。而你的案例只是普遍规则的一个例子。您最好使用一个 IDE(例如 PyCharm 的免费版本,或带有 Python 插件的 Atom)来突出显示名称阴影以避免此类错误。
您可能还想知道什么是“可调用”,在这种情况下您可以阅读 这篇文章。
list
作为一个类,是可调用的。调用类会触发实例构造和初始化。实例也可能是可调用的,但list
实例不是。如果您对类和实例之间的区别更加困惑,那么您可能需要阅读 文档(非常方便,同一页涵盖了名称空间和作用域)。如果你想了解更多关于 builtins 的知识,请阅读 Christian Dean 的回答。
PS 当您启动交互式 Python 会话时,您创建了一个临时模块。