我有一个简单的脚本:
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)
但是,每当我尝试运行我的脚本时,Python都会引发错误:
Traceback (most recent call last):
File "python", line 2, in <module>
TypeError: 'list' object is not callable
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?我为什么要这样做?我该如何解决?
Chr*_*ean 17
在您完全理解错误的含义以及如何解决之前,了解Python中的内置名称非常重要.
在Python中,内置名称是Python解释器已经为其分配预定义值的名称.值可以是函数或类对象.无论范围如何,这些名称在默认情况下始终可用.分配给这些名称的一些值代表Python语言的基本类型,而其他值则非常有用.
截至最新版本的Python - 3.6.2 - 目前有61个内置名称.可以在文档部分内置函数中找到完整的名称列表及其使用方法.
但需要注意的一点是,Python 不会阻止您重新分配内置名称.内置名称不是保留的,Python也允许它们用作变量名.
以下是使用dict内置的示例:
>>> dict = {}
>>> dict
{}
>>>
Run Code Online (Sandbox Code Playgroud)
如您所见,Python允许我们分配dict名称,以引用字典对象.
简单地说,发生错误的原因是因为您在脚本中重新分配了内置名称 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'对象不可调用"的原因是因为如上所述,名称list是指列表对象.所以上面的内容相当于:
[1, 2, 3, 4, 5](range(1, 10))
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用户常犯的错误.这就是为什么总是避免使用内置的名称作为变量,如这一点很重要str,dict,list,range,等.
当您尝试使用内置名称作为变量时,许多linters和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
Run Code Online (Sandbox Code Playgroud)
有关完整问题的解释以及可以采取哪些措施来修复它,请参阅TypeError:尝试访问列表时,"list"对象不可调用.
| 归档时间: |
|
| 查看次数: |
32322 次 |
| 最近记录: |