【发布时间】:2020-08-03 00:16:43
【问题描述】:
我试图了解for x in y 语句在python 中的工作原理。我在这里找到了文档:https://docs.python.org/3/reference/compound_stmts.html#for。它表示表达式 y 被评估一次,并且必须产生一个可迭代的对象。
即使我的类没有实现__iter__(这是我对可迭代的理解),以下代码也会打印数字 1、2、3、4、5。
class myclass:
def __init__(self):
self.x = [1,2,3,4,5]
def __getitem__(self,index):
return self.x[index]
m = myclass()
for i in m:
print(i)
我知道有一个内置方法 iter() 使用其 .__getitem__() 函数和从 0 开始的计数器返回序列对象的迭代器。
我的猜测是,python 在 for x in y 语句中的表达式 y 上调用了 iter() 函数。因此,它将实现.__getitem__ 的对象转换为迭代器,并且当我的对象在.__getitem__ 调用期间引发IndexError 异常时,迭代器将其转换为StopIteration 异常,并且for 循环结束。
这是正确的吗?对还是错,这是在文档中的某个地方进行了解释,还是我需要查看实现的源代码?
【问题讨论】:
-
__getitem__()具有顺序索引,以IndexError终止,是 Python 迭代器协议的原始版本,可追溯到 Python 1.x 时代。显然,为了向后兼容,它仍然受支持。但是,是的,iter()函数完全等同于for循环对其序列对象所做的操作。 -
@RichieV:列表具有
__iter__方法的事实实际上完全无关紧要。如果列表没有__iter__,则此代码的行为相同。 -
@jasonharper - 有趣。我对这项工作感到惊讶。我认为这个答案是值得的。
标签: python python-3.x