首页 > 解决方案 > TypeError:尝试获取可迭代列表时,“列表”对象不可调用

问题描述

在 python 控制台中:

>>> del list # Just to make sure kw: list is not assigned to any variable
>>> my_list = ["a", "b", "c"]
>>> my_iter = iter(my_list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> type(my_list)
<class 'list'>
>>> type(list)
<class 'type'>

我在这里想念什么?我想要一个可迭代的对象,以便next()在循环它时可以访问。例如:

>>> for letter in my_iter:
...     print(next(my_iter))
b
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration

我知道这会在最后一个字母上引发错误,但这无关紧要。

标签: pythonpython-3.xlistiterator

解决方案


您已将名称绑定iter到列表:

>>> my_list = ["a", "b", "c"]
>>> iter(my_list)
<list_iterator object at 0x10b1e04e0>
>>> iter = [42]  # rebinding the name iter to a list object
>>> iter(my_list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> type(iter)
<class 'list'>
>>> callable(iter)
False

异常并没有告诉您传递给调用的列表对象是问题所在。您不是在调用my_list对象,而是在调用iter.

用于del iter删除当前命名空间中的全局名称;该iter()功能是内置的,一旦您删除阴影全局,它将再次被发现:

>>> del iter
>>> iter(my_list)
<list_iterator object at 0x10b1e0358>
>>> type(iter)
<class 'builtin_function_or_method'>
>>> callable(iter)
True
>>> my_iter = iter(my_list)
>>> for letter in my_iter:
...     print(next(my_iter))
...
b
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration

最后的回溯可以通过要求next()返回默认值来修复,例如next(my_iter, 'no more letters').

builtins您还可以从模块中恢复函数引用,因此通过builtins.iter.


推荐阅读