您的猜测是正确的-未定义类型比较的后备结果
==是基于对象标识的比较。
比较它们生成的值的更好方法是
from itertools import izip_longest, teesentinel = object()all(a == b for a, b in izip_longest(gen_1, gen_2, fillvalue=sentinel))
实际上,这可能会短路,而不必一定要查看所有值。正如larsmans在评论中所指出的,我们不能
izip()在这里使用,因为如果生成器生成不同数量的元素,
izip()它将在最短的迭代器上停止,从而产生错误的结果。我们将新创建的
object实例用作的填充值
izip_longest(),因为
object实例也通过对象标识
sentinel进行比较,因此可以保证与其他实例不相等。
请注意,在不更改生成器状态的情况下无法比较生成器。如果以后需要它们,可以存储消耗的物品:
gen_1, gen_1_teed = tee(gen_1)gen_2, gen_2_teed = tee(gen_2)all(a == b for a, b in izip_longest(gen_1, gen_2, fillvalue=sentinel))
这将使离开状态,
gen_1并且
gen_2基本上保持不变。消耗的所有值
all()都存储在
tee对象内部。
到那时,您可能会问自己,为手头的应用程序使用惰性生成器是否真的值得-最好将它们简单地转换为列表并使用列表。



