在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
我知道这会在最后一个字母上引发错误,但这无关紧要。
答案 0 :(得分:1)
您已将名称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.iter
从builtins
module恢复函数引用。