我是Python的新手,遵循教程。教程中有一个list
的例子:
example = list('easyhoss')
现在,在教程中,示例=['e','a',…,'s']
。但在我的例子中,我得到了以下错误:
>>> example = list('easyhoss')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
请告诉我我错在哪里。我搜索所以这个,但它是不同的。
如果您正在进行交互式会话,并且不想重新启动,则可以使用删除阴影
del list
在完全理解错误的含义以及如何解决之前,理解Python中的内置名称是很重要的。
在Python中,内置名称是Python解释器已经分配了预定义值的名称。该值可以是函数或类对象。无论作用域如何,这些名称在默认情况下总是可用的。分配给这些名称的一些值代表Python语言的基本类型,而其他值则非常有用。
截至Python的最新版本3.6.2,目前有61个内置名称。可以在“内置函数”的“文档”部分中找到完整的名称列表及其使用方法。
然而,需要注意的一点是,Python不会阻止您重新分配内置名称。内置名称不保留,Python也允许它们用作变量名。
下面是使用内置的dict
的示例:
>>> dict = {}
>>> dict
{}
>>>
如您所见,Python允许我们指定dict
名称来引用字典对象。
简单地说,发生错误的原因是您在脚本中重新分配了内置名称列表
:
list = [1, 2, 3, 4, 5]
执行此操作时,会重写内置名称的预定义值。这意味着您不能再使用预定义的list
,它是一个表示Python列表的类对象。
因此,当您尝试使用list
类从范围
对象创建新列表时:
myrange = list(range(1, 10))
Python引发了一个错误。错误显示“列表”对象不可调用的原因是,如上所述,名称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
变量重命名为int
:
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用户经常犯的错误。这就是为什么总是避免使用内置名称作为变量是很重要的,例如str
,dics
,list
,range
等。
当您尝试使用内置名称作为变量时,许多linter和ide都会发出警告。如果你经常犯这样的错误,花时间投资其中一个项目可能是值得的。
上述错误的另一个常见原因是试图使用括号(()
)而不是方括号([]
)为列表编制索引。例如:
>>> 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
。这里有一个例子:
>>> 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运行时会在本地名称空间(相对于引用)中查找该名称,如果该名称不存在,则会在更高级别的名称空间中重复该尝试。此过程将继续,直到没有更高的名称空间。在这种情况下,您会得到一个名称错误
。内置函数和类驻留在一个特殊的高阶名称空间\uuuuuuuu
。如果在模块的全局名称空间中声明名为list
的变量,解释器将永远不会在更高级别的名称空间(即\uuuuuuu内置项
)中搜索该名称。类似地,假设您在模块中的函数内创建一个变量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)来突出显示名称阴影,以避免此类错误。
你可能想知道什么是可调用的,在这种情况下,你可以阅读这篇文章。list
,作为一个类,是可调用的。调用类会触发实例构建和初始化。一个实例可能是可调用的,但是list
实例不是。如果您对类和实例之间的区别感到更加困惑,那么您可能需要阅读留档(非常方便,同一页涵盖了名称空间和范围)。
如果你想了解更多关于内置的信息,请阅读Christian Dean的答案。
另外,当您启动交互式Python会话时,您将创建一个临时模块。
问题内容: 我是Python的新手,并且正在学习教程。本教程中有一个示例: 现在,在教程中,。但就我而言,我得到以下错误: 问题答案: 好像你已经用指向类实例的相同名称遮盖了指向类的内置名称。这是一个例子: 我相信这是显而易见的。Python将对象名称(函数和类也是对象)存储在字典中(命名空间实现为字典),因此你可以在任何范围内重写几乎任何名称。它不会显示为某种错误。如你所知,Python强调“特
问题内容: 我正在尝试使用flask在浏览器中显示已连接设备的列表。我在端口8000上启用了flask: 在server.py中: 在app.py中: 这是我的测试: 但我不断收到此错误: 在检查ttyUSB,…和其他设备是否存在时,我做错什么了吗? 问题答案: 问题在于您的端点正在返回列表。Flask只喜欢某些返回类型。可能最常见的两个是 一个对象 一个(与Python 2.x一起使用) 您还可
问题内容: 我得到了这个,我期望它在打印x.withdraw()时能打印410。 这是我的代码: 我是否需要在类本身中修复某些问题,或者我的方法调用有问题? 问题答案: 您在实例上设置具有相同名称的属性: 您正在尝试调用的是该属性,而不是方法。Python不会区分方法和属性,它们也不位于单独的命名空间中。 为属性使用其他名称;(退出的过去时)作为更好的属性名称浮现在脑海: (我也纠正了一个错字;您
我在Python27的这个小代码内容中遇到了这个错误。有人能帮我吗?提前谢谢。 运行时错误回溯(上次调用):文件“5EB4481881D651D6ECE1C375C80F5E509.py”,第57行,在print len(arr)TypeError中:“list”对象不可调用
问题内容: 我有以下代码 当我运行它时,我得到了: 这是为什么?怎么修? 问题答案: 将变量称为。它掩盖了内置功能。
问题内容: 码: 第一次工作,然后第二次出现错误: 有人知道为什么是这样吗? 我已经尝试过了,但出现错误: 问题答案: 这就是问题: 你正在重新定义什么意思。是字符串类型的内置Python名称,你不想更改它。 为本地变量使用其他名称,然后删除该语句。