当我运行此迭代器时:
iter(lambda : object() > object(), object())
迭代器不断输出True
和False
。
但那是什么意思以及它是如何执行的?
答案 0 :(得分:5)
正如评论中已经说明的那样,这是一个实现细节,只是“恰好”给出False
和True
的交替序列(但是,无法预测第一个是False
{{ 1}}或__eq__
)。
让我们从关于CPython 2.7的一些事实开始:
print
并与另一个相同类型的对象进行比较,则会比较内存地址。让我们看一下你的迭代器,这次使用not-lambda函数和def cmp_objects():
a = object()
b = object()
print id(a)
print id(b)
print a > b
x = iter(cmp_objects, object())
next(x), next(x), next(x), next(x), next(x)
s作为内存地址:
69637872
69638064
False
69638064
69637872
True
69637872
69638064
False
69638064
69637872
True
69637872
69638064
False
给出:
a
因此69637872
变量的内存地址为b
,69638064
的内存地址为b
。由于False
的内存地址较大,因此返回iter
。在下一次调用中,内存地址被交换(记住LIFO),依此类推。
因为sentinel的内存地址(True
的第二个参数)与False
和True
的内存地址不同,所以循环永远不会停止并且交替False
和>>> import itertools
>>> it = itertools.cycle((True, False))
。
然而,获得这样一个序列的更好方法是:
object
这也具有可预测的第一产值。如果在next
次调用之间创建>>> x = iter(lambda : object() > object(), object())
>>> next(x)
True
>>> object()
<object at 0x4269610>
>>> next(x)
True
,它也不会中断:
{{1}}
这个例子可能给出不同的结果,这样结果是完全随机的!