当我将迭代器分配给变量时发生了什么
What happend when i assign an iterator to a variable
我定义了一个列表i,它是可迭代的。如代码所示,当它调用 __iter__() 方法时,将返回一个迭代器。但是当我四次调用它的 next() 方法时,它只打印四次 1,而不是 1,2,3,4.
>>> i=[1,2,3,4]
>>> i.__iter__
<method-wrapper '__iter__' of list object at 0x04040378>
>>> i.__iter__()
<listiterator object at 0x040561F0>
>>> i.__iter__().next()
1
>>> i.__iter__().next()
1
>>> i.__iter__().next()
1
>>> i.__iter__().next()
1
所以我做了一些打击:)
>>>ite=i.__iter__()
>>>ite.next()
1
>>>ite.next()
2
>>>ite.next()
3
>>>ite.next()
4
>>> ite.next()
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
ite.next()
StopIteration
谁能告诉我这两种方式的区别?非常感谢 :)
每次调用 __iter__
都会得到一个新的迭代器。在你的第一个例子中,你调用了 __iter__
四次,所以你得到了四个新的迭代器,并且你在每个迭代器上调用了一次 next
,所以你总是得到第一个值。在你的第二个例子中,你调用了一次 __iter__
,所以你只得到一个迭代器,你在同一个迭代器上调用了四次 next
,所以你得到了所有四个值。
我定义了一个列表i,它是可迭代的。如代码所示,当它调用 __iter__() 方法时,将返回一个迭代器。但是当我四次调用它的 next() 方法时,它只打印四次 1,而不是 1,2,3,4.
>>> i=[1,2,3,4]
>>> i.__iter__
<method-wrapper '__iter__' of list object at 0x04040378>
>>> i.__iter__()
<listiterator object at 0x040561F0>
>>> i.__iter__().next()
1
>>> i.__iter__().next()
1
>>> i.__iter__().next()
1
>>> i.__iter__().next()
1
所以我做了一些打击:)
>>>ite=i.__iter__()
>>>ite.next()
1
>>>ite.next()
2
>>>ite.next()
3
>>>ite.next()
4
>>> ite.next()
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
ite.next()
StopIteration
谁能告诉我这两种方式的区别?非常感谢 :)
每次调用 __iter__
都会得到一个新的迭代器。在你的第一个例子中,你调用了 __iter__
四次,所以你得到了四个新的迭代器,并且你在每个迭代器上调用了一次 next
,所以你总是得到第一个值。在你的第二个例子中,你调用了一次 __iter__
,所以你只得到一个迭代器,你在同一个迭代器上调用了四次 next
,所以你得到了所有四个值。