Python`for`不会迭代枚举对象

时间:2014-11-25 10:02:39

标签: 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 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:[[]]

文档:

在线运行:http://goo.gl/75yuAd

4 个答案:

答案 0 :(得分:3)

因为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 :(得分:2)

任何迭代器都是&#34;一次性&#34;在某种意义上说,当它完全执行时,它变空了,不能再使用了。当你调用logging.debug( list(e) )时,你已经在list()函数中使用它,因此用尽它。因此,以下尝试在for周期中使用它不会产生任何效果。

使用修改后的代码,在此调试后再次调用enumerate()时,脚本行为会发生变化 - 它会在y[int(k)].append( v )上引发IndexError;我不会为你解决这个问题,但这足以说明循环体开始被执行了。

答案 2 :(得分:1)

这一行:

logging.debug( list(e) )

消耗迭代器,所以当你到达时:

for k, v in e:
   # ...

e已经用尽。

答案 3 :(得分:0)

试试这个:

e = list(enumerate(d))