Answers:
如果对象没有__contains__实现,请in使用默认的默认设置,该默认设置基本上是这样的:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
如果对象没有__iter__实现,则for使用默认的默认设置,该默认设置基本上是这样的:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
即使对象不是序列,也将使用这些默认值。
你1 in f和5 in f测试使用的是默认的回退in和for,导致观察到的行为。立即1 in f发现1,但您__getitem__永不归来5,因此5 in f永远运行。
(实际上,在Python的参考实现中,默认的__iter__后备存储将索引存储在类型为C的变量中Py_ssize_t,因此,如果等待足够长的时间,该变量将最大化,并且Python会引发OverflowError。如果看到了,您可以必须在32位Python版本上运行。计算机的存在时间不足以使任何人都能在64位Python上运行它。)