iter(a) is iter(a)?

2015-10-18 Li Shuai 更多博文 » 博客 » GitHub »

Python 技术

原文链接 https://cyrusin.github.io/2015/10/18/iter20151018/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


"可迭代对象"与"迭代器"

Python中迭代器指的是实现了__iter__协议与next()方法的对象,其中__iter__协议中返回对象自身(self),next()方法每次返回单一元素,直至所有元素遍历结束,抛出'StopIteration'异常结束。

可迭代对象是一种更宽泛的定义,只要对象实现了__iter__协议,返回一个迭代器(并不像迭代器一样必须返回自身self)用来遍历自己的元素集合,那这个对象就是可迭代的对象,也意味着可以直接通过for item in obj...的方式遍历。

iter(a) is iter(a)?

>>a = [1, 2, 3]
>>iter(a) is iter(a) #(1)
>>False
>>b = iter(a)
>>iter(b) is iter(b) #(2)
>>True

以上代码中的a可以是任意container型对象(list, tuple, set, dict...)。可以看到(1) 和 (2)的结果是不同的。

原因是:

iter调用意味着获取对象的迭代器(即__iter__协议返回的迭代器) container实现了__iter__协议,是可迭代的对象,通过iter(a)调用,返回了对象a的迭代器 每次iter(a)都返回一个a的迭代器,是不同的对象(虽然他们功能一样),所以(1)是False,因为他们是不同的对象 (2)对一个迭代器进行iter调用,根据迭代器的定义,迭代器的__iter__协议返回的是迭代器对象自身 所以(2)iter(b) is iter(b)是True, 因为b是迭代器,每次iter(b)返回的都是b自身