为什么接下来(a)在下一步(ia)在Python中返回列表的第一个元素时给出错误?

时间:2016-06-02 09:48:20

标签: python list iterator listiterator

trait Persistent {
  String id
}

class SomeDomain implements Persistent {
  // other persistent properties
}

为什么下一个(a)在下一个(ia)在Python中返回列表的第一个元素时给出错误?为什么会这样?

1 个答案:

答案 0 :(得分:3)

这实际上是因为异常告诉你:

  

list object不是迭代器

为了能够迭代序列,您需要拥有一个当前位置,而列表没有这个概念,因为这意味着共享列表的每个人也会共享当前位置。

另一方面,迭代器特定于某个范围并跟踪当前位置。当您从列表中请求迭代器时,每次都会得到一个新的迭代器。

>>> a = [1, 2, 3]
>>> ia = iter(a)
>>> ia2 = iter(a)
>>> ia is ia2
False
>>> next(ia)
1
>>> next(ia2)
1

如您所见, ia ia2 具有独立的当前位置,因为它们是不同的迭代器。

为了说明我们为什么需要这个,这里有一个使用两个循环迭代同一个列表的例子:

>>> for i in a:
...     print("{}:".format(i))
...     for j in a:
...             print("\t{}".format(j))
... 
1:
        1
        2
        3
2:
        1
        2
        3
3:
        1
        2
        3

这是有效的,因为每个for循环使用一个单独的迭代器。

如果我们改为使用相同的迭代器,我们会得到非常不同的结果:

>>> a = iter(a)
>>> for i in a:
...     print("{}:".format(i))
...     for j in a:
...             print("\t{}".format(j))
... 
1:
        2
        3

这次,两个迭代器共享当前位置,因此我们只会迭代列表一次,无论循环是否嵌套。