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

fin*_*ion 2 python lambda iterator python-2.7

当我运行这个迭代器时:

iter(lambda : object() > object(), object())
Run Code Online (Sandbox Code Playgroud)

迭代器不断输出TrueFalse.

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

MSe*_*ert 5

正如在评论中已经说过,这是一个实现细节,它只是"碰巧"给的交替序列TrueFalse(然而,一个不能,如果第一个是预测TrueFalse).

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

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

让我们看一下你的迭代器,这次使用not-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)
Run Code Online (Sandbox Code Playgroud)

这使:

69637872
69638064
False
69638064
69637872
True
69637872
69638064
False
69638064
69637872
True
69637872
69638064
False
Run Code Online (Sandbox Code Playgroud)

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

因为定点(第二个参数的存储器地址iter)是从存储器ADRESS不同TrueFalse循环从不停止并给出交替的TrueFalse.


但是,获得这样一个序列的更好方法是:

>>> import itertools
>>> it = itertools.cycle((True, False))
Run Code Online (Sandbox Code Playgroud)

这也具有可预测的第一产值.如果objectnext调用之间创建s,它也不会中断:

>>> x = iter(lambda : object() > object(), object())
>>> next(x)
True
>>> object()
<object at 0x4269610>
>>> next(x)
True
Run Code Online (Sandbox Code Playgroud)

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