回答:
オブジェクトに__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でコンピュータを攻撃するのに十分な期間、コンピュータは存在していません。
forとin、の導入をより以前__iter__と__contains__。こちらとこちらの Python 1.4ドキュメントをご覧ください。