python - 为什么逆向迭代器要求索引为负 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 才能使迭代器正常工作。为什么它会这样?
解决方案
当您使用self.idx -= 1
时,self.idx
会遍历值2, 1, 0, -1, -2, -3, -4
,并带有IndexError
at -4
。-1, -2, -3
都是 Python 中的有效索引。
使用时self.idx -= 2
,self.idx
会遍历值2, 0, -2, -4
。所以它只打印三个值,但顺序错误。
不要except IndexError
用于这个目的,使用if self.idx < 0
什么的。
print
还要养成使用语句调试程序的习惯。Aprint(self.idx)
可能会透露发生在你身上的事情。
推荐阅读
- css - Jumbotron 背景图像不起作用。我究竟做错了什么?
- javascript - 从字符串查询中获取命名参数
- sql - DATEDIFF - 我的 SQL 查询有什么问题?
- flutter - ListvVew 中的文本被换行而不是溢出
- go - 如何使用接口在 Golang 中为数据库实现依赖注入
- r - 使用 ggplot 2 为不同的函数创建一个图?
- function - Google Sheets Script – 输出单元格背景颜色的函数
- javascript - 如何在 JS 中获取数组而不是对象的数据?
- java - java.lang.NoSuchMethodError: org.json4s.jackson.JsonMethods$.parse$default$3()Z
- git - 如何比较 CloudBuild 中的 Git 分支?