我在蟒蛇中很穷,所以请不要打败我。
>>> a = ['a', 'b', 'c']
>>> a.__iter__()
<listiterator object at 0x03531750>
>>> a.__iter__().__iter__()
<listiterator object at 0x03531690>
我看到两个listiterator对象都存在于其他地方(0x03531750
就像地方一样?)。我需要知道这两个对象是相同的,但是生活在其他地方还是不同?
答案 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中:)