lists 不能被假定为已排序(或任何顺序),因此二进制搜索不起作用。也不能假定键是可散列的,因此与 dict 或 set 不同,不能使用散列表查找来加速搜索
据推测,这是从第一个到最后一个元素的直接检查。
我会尝试挖掘相关的 Python 源代码。
--
编辑:实现in 运算符的Python list.__contains__() 函数在listobject.c 中定义:
393 static int
394 list_contains(PyListObject *a, PyObject *el)
395 {
396 Py_ssize_t i;
397 int cmp;
398
399 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
400 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
401 Py_EQ);
402 return cmp;
403 }
它遍历列表中的每个元素,从第一个元素到最后一个元素(或直到找到匹配项。)这里没有捷径。
--
编辑 2:情节变厚了。如果 Python 检测到您正在测试 constant list 或 set 中某个元素的成员资格,例如:
if letter in ['a','e','i','o','u']: # list version
if letter in {'a','e','i','o','u'}: # set version
编辑 3 [@JohnMachin]:
常量列表在 2.5-2.7 和 3.1-3.3 中优化为常量元组。
常量集在 3.3 中优化为(常量)frozenset。
另见@CoryCarson 的回答。