“iter(lambda:object()> object(),object())”是什么意思“

时间:2017-07-13 23:44:00

标签: python python-2.7 lambda iterator

当我运行此迭代器时:

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

迭代器不断输出TrueFalse

但那是什么意思以及它是如何执行的?

1 个答案:

答案 0 :(得分:5)

正如评论中已经说明的那样,这是一个实现细节,只是“​​恰好”给出FalseTrue的交替序列(但是,无法预测第一个是False {{ 1}}或__eq__)。

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

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

让我们看一下你的迭代器,这次使用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变量的内存地址为b69638064的内存地址为b。由于False的内存地址较大,因此返回iter。在下一次调用中,内存地址被交换(记住LIFO),依此类推。

因为sentinel的内存地址(True的第二个参数)与FalseTrue的内存地址不同,所以循环永远不会停止并且交替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}}

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