"iter(lambda : object() > object(), object())"的含义是什么



当我运行这个迭代器时:

iter(lambda : object() > object(), object())

迭代器连续输出TrueFalse

但是这有什么意义,它是如何执行的?

正如评论中已经指出的那样,这是一个实现细节,它只是"碰巧"给出交替的TrueFalse序列(但是,无法预测第一个是True还是False)。

让我们从关于CPython 2.7的一些事实开始:

  • 如果 python-2.x 中的某个对象没有实现__eq__,并且与另一个相同类型的对象进行比较,则会比较内存地址。
  • 一些内存地址以LIFO(后进先出)方式重复使用

让我们看一下你的迭代器,这次使用非lambda函数和内存地址的prints:

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)

这给了:

69637872
69638064
False
69638064
69637872
True
69637872
69638064
False
69638064
69637872
True
69637872
69638064
False

因此,a变量以内存地址69637872开头,并以69638064b开头。因为b的内存地址更大,所以返回False。在下一次调用中,内存地址被交换(记住LIFO),依此类推。

因为哨兵的内存地址(iter的第二个参数)与True的内存地址不同,False循环永远不会停止并交替TrueFalse


但是,获取此类序列的更好方法是:

>>> import itertools
>>> it = itertools.cycle((True, False))

这也具有可预测的首次收益值。如果在next调用之间创建object,它也不会中断:

>>> x = iter(lambda : object() > object(), object())
>>> next(x)
True
>>> object()
<object at 0x4269610>
>>> next(x)
True

这个例子可能会给出不同的结果,这样结果是完全随机的!

最新更新