首页 > 解决方案 > 关于python中的迭代器的困惑

问题描述

我对python中的迭代器感到困惑。请看一下代码。

class MyNumbers:
  def __init__(self):
     self.a=4
  def __iter__(self):
    return self

  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration

myclass = MyNumbers()
myiter1 = iter(myclass)
c=list(myiter1)
for x in myiter1:
  print(x)

我没有从上面的代码中得到任何输出。我期待从 4 开始进行一些值迭代。但是当我删除时,c=list(myiter1)我得到了预期的输出。所以我对此感到困惑。为什么会这样。

标签: pythoniterator

解决方案


您的迭代器已用尽:list在分配中c消耗了所有可用值,从而产生一个列表和一个迭代器,当您再次尝试对其进行迭代时,该列表[4, 5, 6, ..., 20]和迭代器将立即引发。StopIteration

您可能会感到困惑,因为您似乎可以多次迭代列表。但那是因为列表本身不是迭代器。

>>> list.__next__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'list' has no attribute '__next__'

调用iter列表会产生一个list_iterator值,而不是列表本身。该迭代器与任何其他迭代器一样是可耗尽的。

>>> x = [1,2,3]
>>> y = iter(x)
>>> type(y)
<class 'list_iterator'>
>>> list(y)
[1, 2, 3]
>>> list(y)
[]

for循环隐式调用iter您尝试迭代的事物。按照惯例,所有迭代器也是可迭代的:迭代器__iter__应该返回self


推荐阅读