trait Persistent {
String id
}
class SomeDomain implements Persistent {
// other persistent properties
}
为什么下一个(a)在下一个(ia)在Python中返回列表的第一个元素时给出错误?为什么会这样?
答案 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
这次,两个迭代器共享当前位置,因此我们只会迭代列表一次,无论循环是否嵌套。