首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iter(x)和x.__iter__()有什么区别?

iter(x)和x.__iter__()有什么区别?
EN

Stack Overflow用户
提问于 2015-07-23 22:49:14
回答 5查看 1.2K关注 0票数 7

iter(x)x.__iter__()之间的区别是什么

据我所知,它们都返回一个listiterator对象,但在下面的示例中,我注意到它们并不相等:

代码语言:javascript
复制
x = [1, 2, 3]
y = iter(x)
z = x.__iter__()
y == z
False

关于迭代器对象有什么我不理解的地方吗?

EN

回答 5

Stack Overflow用户

发布于 2015-07-23 22:54:37

基于这类东西,Iter对象不具有等价性。

确保iter(x) == iter(x)也返回False。这是因为iter函数(调用__iter__)返回一个不会重载__eq__的iter对象,因此只有在两个对象相同时才返回True

在没有重载的情况下,==is比较相同。

此外,x.__iter__().__class__ is iter(x).__class__显示,在本例中,它们返回相同类型的对象。

票数 8
EN

Stack Overflow用户

发布于 2015-07-23 22:58:20

这与通过调用iter(x)x.__iter__()创建迭代器没有区别。您正在创建2个listiterator对象并对它们进行比较。对它们进行比较,看看它们是否是相同的迭代器对象,而不是它们产生的结果。

代码语言:javascript
复制
>>> test = [1,2,3,4]
>>> iter(test)
<listiterator object at 0x7f85c7efa9d0>
>>> test.__iter__()
<listiterator object at 0x7f85c7efaa50>

您可以看到生成了两个不同的对象。

如果你也调用iter(test)两次,也是一样的。

通过将两个变量指向同一个对象,可以使它们相同。

代码语言:javascript
复制
>>> test = [1,2,3,4]
>>> iter_one = iter(test)
>>> iter_two = iter_one
>>> print iter_one == iter_two
True
>>> iter_one.next()
1
>>> iter_two.next()
2

您可以看到它们都引用了同一个对象。

您可以通过再次将差分迭代器转换回列表来检查它们是否产生相同的输出。

代码语言:javascript
复制
>>> print list(iter(test)) == list(test.__iter__())
True
票数 1
EN

Stack Overflow用户

发布于 2015-07-23 22:58:39

它们并不总是完全相同的。来自documentation -

iter(o,sentinel)

返回迭代器对象。根据第二个参数的存在,第一个参数的解释会有很大的不同。如果没有第二个参数,o必须是支持迭代协议( __iter__()方法)的集合对象,或者它必须支持序列协议(具有从0开始的整数参数的__getitem__()方法)。

但对于您的列表情况,它们是相似的,因为在iter()内部调用__iter__()。但它们都返回不同的迭代器对象,您可以分别迭代这两个对象的返回值,因此它们不相等。

示例显示迭代器的一般情况:

代码语言:javascript
复制
In [13]: class CA:
   ....:     def __iter__(self):
   ....:         print('Inside __iter__')
   ....:         return iter([1,2,3,4])
   ....:

In [14]: c = CA()

In [15]: iter(c)
Inside __iter__
Out[15]: <list_iterator at 0x3a13d68>

In [16]: c.__iter__()
Inside __iter__
Out[16]: <list_iterator at 0x3a13908>    #see that even the ids are different for the list_iterator objects.

In [17]: class BA:
   ....:     def __getitem__(self,i):
   ....:         print('Inside __getitem__')
   ....:         return i+5
   ....:

In [18]: b = BA()

In [19]: iter(b)
Out[19]: <iterator at 0x3a351d0>

In [20]: x = iter(b)

In [21]: next(x)
Inside __getitem__
Out[21]: 5

In [23]: next(x)
Inside __getitem__
Out[23]: 6

示例显示每个对iter()的调用都会返回一个不同的迭代器对象,该对象可以单独迭代-

代码语言:javascript
复制
In [24]: i = iter(c)
Inside __iter__

In [25]: j = iter(c)
Inside __iter__

In [26]: for x in i:
   ....:     pass
   ....:

In [27]: next(i)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-27-bed2471d02c1> in <module>()
----> 1 next(i)

StopIteration:

In [28]: next(j)
Out[28]: 1

正如您在上面看到的,即使i耗尽了,j仍然在起始位置,所以您可以看到两者是完全不同的对象(具有不同的状态)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31590858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档