首页 > 解决方案 > 为什么逆向迭代器要求索引为负 2 而不是 1?

问题描述

当我尝试像在下面的示例中所做的那样反转迭代器时,实际上我得到了两次打印的结果:

class TestIterator:

  def __init__(self):
    self.list = ['Alice', 'Bob', 'Charlie']

  def __iter__(self):
    self.idx = len(self.list) - 1
    return self

  def __next__(self):
    try:
      res = self.list[self.idx]
    except IndexError:
      raise StopIteration
    self.idx -= 1
    return res

names = TestIterator()

for name in names:
  print(name)

结果:

Charlie
Bob
Alice
Charlie
Bob
Alice

在上面的结果中,名称被打印了两次。我本来希望它以这种方式打印:

Charlie
Bob
Alice

然而,奇怪的是,在闲逛了一会儿之后,我注意到如果我有self.idx -= 2,它只打印了一次,但顺序仍然是错误的。例子:

...
  def __next__(self):
    try:
      res = self.list[self.idx]
    except IndexError:
      raise StopIteration
    self.idx -= 2
    return res
...

这打印:

Charlie
Alice
Bob

我不明白为什么我必须在索引上减去 2 才能使迭代器正常工作。为什么它会这样?

标签: pythoniterator

解决方案


当您使用self.idx -= 1时,self.idx会遍历值2, 1, 0, -1, -2, -3, -4,并带有IndexErrorat -4-1, -2, -3都是 Python 中的有效索引。

使用时self.idx -= 2self.idx会遍历值2, 0, -2, -4。所以它只打印三个值,但顺序错误。

不要except IndexError用于这个目的,使用if self.idx < 0什么的。

print还要养成使用语句调试程序的习惯。Aprint(self.idx)可能会透露发生在你身上的事情。


推荐阅读