iter(a) is iter(a)?
原文链接 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自身