我想知道是否有某种灵魂可以解释为什么我必须在调用enumerate之前转换已经是类型列表的列表。
>>> l = ['russell', 'bird', 'thomas']
>>> print(type(l))
Type is: `class 'list'`.
如果我在没有明确声明这个列表的情况下枚举这个列表,那就是输出:
>>> print(enumerate(l))
enumerate object at 0x00B1A0F8
当明确地将此列表声明为列表时,输出符合预期:
>>> print(list(enumerate(l)))
[(0, 'russell'), (1, 'bird'), (2, 'thomas')]
如果有人可以帮助解释为什么会这样,那么我们将非常感激。
答案 0 :(得分:2)
这里有两个不同的对象。假设您定义了一个函数:
def my_func(my_list):
return 4
如果你my_func(l)
,那么它当然不会返回列表。那么,enumerate()
也是一样的。它返回一个enumerate
对象,而不是列表。但是,该对象是可迭代的,因此可以将其转换为列表。例如:
def my_enumerate(my_list):
index = 0
for item in my_list:
yield index, item
index += 1
这就是enumerate
的工作原理。我们的函数是一个生成器函数并返回一个生成器对象。由于生成器是可迭代的,您可以将其转换为列表:
print(list(my_enumerate(l))
答案 1 :(得分:1)
Python文档倾向于非常小心地说出函数返回的内容,并且docs for enumerate()
说它返回枚举对象,而不是列表。 (请注意,Python 2已经是这种情况。)
虽然明确地创建一个完整的列表似乎很麻烦,比如
print(list(enumerate(mylist)))
返回列表的优点是它可以更快并且使用更少的内存。预计在实际使用中,您通常不会立即需要整个列表,而是一次循环一个元素,例如
for i, elem in enumerate(mylist):
print(i, '->', elem)
您甚至可能不会使用所有元素:
mylist = ['russell', 'bird', 'thomas']
for i, elem in enumerate(mylist):
if elem == 'bird':
break
print((i, elem))
因此,enumerate()
为您提供仅在需要时生成项目的效率,而不是一次性生成项目。 (想象一下,如果您正在处理历史上每个NBA球员的名单,而不仅仅是您示例中的三个球员。)在极少数情况下,您确实需要同时拥有所有项目,但不是 恼人的是必须输入list(enumerate(mylist))
。