Python`for`不在枚举对象上迭代

Python`for`不在枚举对象上迭代,python,loops,iteration,python-3.4,enumerable,Python,Loops,Iteration,Python 3.4,Enumerable,为什么不迭代呢 import logging logging.basicConfig(level=logging.DEBUG) x = [] y = [[] for n in range(0, 1)] linedata = ["0","1","2"] x.append( linedata[0] ) d = linedata[1:] logging.debug( "d: {}".format(d) ) e = enumerate(d) logging.debug( list(e) ) for

为什么不迭代呢

import logging
logging.basicConfig(level=logging.DEBUG)

x = []
y = [[] for n in range(0, 1)]
linedata = ["0","1","2"]
x.append( linedata[0] )

d = linedata[1:] 
logging.debug( "d: {}".format(d) )
e = enumerate(d)
logging.debug( list(e) )
for k, v in e:
  logging.debug( "k:{} v:{}".format( k, v ) )
  y[int(k)].append( v )
  #for d in [(0,1)]:
  #logging.debug( "k:{} v:{}".format( d[0], d[1] ) )
  #y[d[0]].append( d[1] )

logging.debug( x )
logging.debug( y )
输出:

DEBUG:root:d: ['1', '2']
DEBUG:root:[(0, '1'), (1, '2')]
DEBUG:root:['0']
DEBUG:root:[[]]
文件:

联机运行:

任何迭代器都是“一次性”的,因为当它被完全执行时,它将变为空并且不能再使用。当您调用
logging.debug(list(e))
时,您已经在list()函数中使用了它,因此耗尽了它。因此,以下在
for
循环中使用它的尝试没有给出任何结果

在调试后再次调用enumerate()时,如果使用修改后的代码,脚本行为将发生更改-它将在
y[int(k)]上引发Indexer;我不会为您解决这个问题,但这足以表明循环体开始执行。

任何迭代器都是“一次性”的,因为当它完全执行时,它将变为空,无法再使用。当您调用
logging.debug(list(e))
时,您已经在list()函数中使用了它,因此耗尽了它。因此,以下在
for
循环中使用它的尝试没有给出任何结果

在调试后再次调用enumerate()时,如果使用修改后的代码,脚本行为将发生更改-它将在
y[int(k)]上引发Indexer;我不会为您解决这个问题,但这足以表明循环体开始执行。

这一行:

logging.debug( list(e) )
消耗迭代器,因此当您到达此处时:

for k, v in e:
   # ...
e
已用完。

此行:

logging.debug( list(e) )
消耗迭代器,因此当您到达此处时:

for k, v in e:
   # ...

e
已用尽。

因为
枚举
返回迭代器:

>>> e = enumerate(range(4))
>>> list(e)
[(0, 0), (1, 1), (2, 2), (3, 3)]
>>> list(e)
[]
一旦到达终点,
e.next()
将引发一个
StopIteration
异常:

>>> e.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>e.下一步()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代

因此,您不能在
e
上迭代两次。您必须重新创建迭代器。

因为
enumerate
返回迭代器:

>>> e = enumerate(range(4))
>>> list(e)
[(0, 0), (1, 1), (2, 2), (3, 3)]
>>> list(e)
[]
一旦到达终点,
e.next()
将引发一个
StopIteration
异常:

>>> e.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>e.下一步()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
因此,您不能在
e
上迭代两次。您必须重新创建迭代器。

请尝试以下方法:

e = list(enumerate(d))
请尝试以下方法:

e = list(enumerate(d))

Try:enumerate(d)中的k,v:Try:enumerate(d)中的k,v:“任何迭代器都是“一次性的”,在这个意义上,当它被完全执行时,它将变为空并且不能再使用”:这不是真的。您可以轻松编写一个无限迭代器,
itertools
中有几个迭代器,如
count()
cycle()
repeat()
@brunodesthuilliers,它们不会使语句无效。这些都是迭代器不会耗尽的例子。@Marcin:半空杯vs半满杯。。。但是Python新手应该知道,并不是所有的迭代器都是有限的。“任何迭代器都是“一次性的”,在这个意义上,当它被完全执行时,它会变成空的,并且不能再使用”:这不是真的。您可以轻松编写一个无限迭代器,
itertools
中有几个迭代器,如
count()
cycle()
repeat()
@brunodesthuilliers,它们不会使语句无效。这些都是迭代器不会耗尽的例子。@Marcin:半空杯vs半满杯。。。但是Python新手应该知道并不是所有的迭代器都是有限的。你能在回答的同时添加一些额外的信息吗?你能在回答的同时添加一些额外的信息吗?