TypeError: object of type 'enumerate' has no len()
len() 函数要求对象具有或实现 __len__ 函数。
object.__len__(self)
调用以实现内置函数len()。应该返回对象的长度,整数>= 0。
不幸的是,enumerate 返回了一个没有__len__ 的枚举对象:
>>> a = enumerate([1,2,3])
>>> a
<enumerate object at 0x10e496be0>
>>> dir(a)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__',
'__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__']
与支持len()的list不同:
>>> a = [1,2,3]
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
...
'__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__',
...
'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
您还可以注意到,枚举对象也没有__getitem__ 方法,该方法允许您使用obj[index] 访问项目,例如list's。这就是为什么你在your answer 中说“它甚至不能下标”。
我认为我们可以将枚举对象视为列表。
不,不是真的。 枚举对象的行为更像iterator,这是 Python 表示可能无限的“数据流”的方式。您可以通过调用 next() 方法访问数据,直到引发异常 (StopIteration)。
重复调用迭代器的__next__() 方法(或将其传递给
内置函数next()) 返回流中的连续项目。
当没有更多数据可用时,会引发 StopIteration 异常
而是。
>>> a = enumerate([1,2,3])
>>> next(a)
(0, 1)
>>> next(a)
(1, 2)
>>> next(a)
(2, 3)
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
我认为您认为它们类似于list,因为您也可以将它们放入像常规list 一样的循环结构中并遍历每个元素:
>>> a = enumerate([1,2,3])
>>> for i in a:
... print(i)
...
(0, 1)
(1, 2)
(2, 3)
在这种情况下,对于每次迭代,枚举对象提供一个元组,其中包含下一个元素的索引和元素本身。 for 循环的工作方式和结束方式与您使用 枚举对象 的 next() 方法时相同。
如enumerate() 文档中所示,如果您需要类似列表的内容,您只需将其转换为list:
>>> a = list(enumerate([1,2,3]))
>>> a
[(0, 1), (1, 2), (2, 3)]