object(), object())"是什么意思-6ren"> object(), object())"是什么意思-当我运行这个迭代器时: iter(lambda : object() > object(), object()) 迭代器不断输出True 和False。 但是那是什么意思,又是如何执行的呢? 最佳答案-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:41:05 25 4
gpt4 key购买 nike

当我运行这个迭代器时:

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

迭代器不断输出TrueFalse

但是那是什么意思,又是如何执行的呢?

最佳答案

如评论中所述,这是一个实现细节,它只是“碰巧”给出了 TrueFalse 的交替序列(但是,无法预测是否第一个是 TrueFalse)。

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

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

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

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 变量以 69637872b 开始的内存地址为 69638064。因为 b 的内存地址更大,所以返回 False。在下一次调用中,内存地址被交换(记住 LIFO),依此类推。

因为 sentinel 的内存地址(iter 的第二个参数)与 TrueFalse 的内存地址不同,循环永远不会停止并交替给出 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

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

关于python - "iter(lambda : object() > object(), object())"是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45092527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com