容器.__ iter __()和iterator .__ iter __()之间有什么区别?

时间:2011-11-14 17:58:29

标签: python

我在蟒蛇中很穷,所以请不要打败我。

>>> a = ['a', 'b', 'c']
>>> a.__iter__()
<listiterator object at 0x03531750>
>>> a.__iter__().__iter__()
<listiterator object at 0x03531690>

我看到两个listiterator对象都存在于其他地方(0x03531750就像地方一样?)。我需要知道这两个对象是相同的,但是生活在其他地方还是不同?

3 个答案:

答案 0 :(得分:8)

迭代器有一个__iter__()方法,因此您可以在其上调用iter()来获取它的迭代器,即使它已经是一个。如果您不必经常检查某些东西是否已经是迭代器,那么编写使用迭代器的东西会更容易。

因此,您将获得列表的迭代器,然后获取该迭代器的迭代器。迭代器的迭代器是原始迭代器(Python不会创建第二个迭代器,没有意义)。

好的,到目前为止很好。

迭代器是对象,与所有对象一样,具有生命周期。它们是在对象上调用__iter__()(或iter())时创建的,并在不再引用它们时销毁。在您的示例中,执行a.__iter__(),这将创建列表迭代器。然后,由于你没有在任何地方保持对它的引用,这个迭代器会或多或少立即被销毁(尽管这是一个实现细节)。所以你的下一个命令a.__iter__().__iter__()为列表创建一个 new 迭代器(只有一个,因为迭代器的迭代器是相同的迭代器) - 它不会重用你在的迭代器上一个命令,因为迭代器已经消失了。这就是对象具有不同ID的原因;它们实际上是不同的对象。

如果您保留对前者的引用,您会看到a.__iter__()a.__iter__().__iter__()是同一个对象。试试这个:

a = ['a', 'b', 'c']
i = iter(a)    # a.__iter__()
j = iter(i)    # i.__iter__() which is a.__iter__().__iter__()
print i is j   # True, they're the same object

答案 1 :(得分:2)

iter(iterable)返回一个迭代器,以便您可以调用(显式或隐式地,例如,通过for - 循环)next(iterator)来获取iterable中的下一个项目或收到StopIteration例外。

iter(iterator)应该自行返回:

>>> it = iter([])
>>> it is iter(it)
True

忘记内存位置,例如jython,pypy会返回不同的内容。

答案 2 :(得分:1)

0x03531690是对象的虚拟内存位置,基本上它不会告诉你什么

例如:

>>> a = ['a', 'b', 'c']
>>> a.__iter__()
<listiterator object at 0x102d70d90>
>>> a.__iter__()
<listiterator object at 0x102d70e10>

我不知道您要尝试将另一个List Iterator添加到迭代字符列表的List Iterator中:)