xrange如何让您测试成员资格?

问题描述 投票:-1回答:1

[每个人似乎都声称xrange返回了一个生成器,但这实际上是它自己的事情:

>>> xrange(10)
xrange(10)
>>> xrange(10).__bases__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'xrange' object has no attribute '__bases__'

我不知道是xrange如何让您检查会员资格。

>>> a = xrange(10)
>>> 4 in a
True
>>> 4 in a
True

如果这是真正的生成器,则第二次检查将失败,因为我们已经遍历了4。

>>> def mygen():
...     num = 0
...     while num < 100:
...             yield num
...             num += 1
...
>>>
>>> mygen()
<generator object mygen at 0x100618b40>
>>> list(mygen())
[0, ..., 99]
>>> x = mygen()
>>> 4 in x
True
>>> 4 in x
False

xrange似乎有一些特别之处,它可以使其正确地成为成员身份,好像它覆盖了__contains__

python python-2.7 python-2.x python-2.6 xrange
1个回答
0
投票

事实证明,xrange确实不是真实的<type 'generator'>

cython level处,有一个生成器为范围逻辑提供动力,但还有一个range_contains_long函数,它进行比较,绕过生成器的迭代。

因此,将xrange称为generator有点误导。

© www.soinside.com 2019 - 2024. All rights reserved.