6.10.2. 成员检测运算
运算符 in
和 not in
用于成员检测。 如果 x 是 s 的成员则 x in s
求值为 True
,否则为 False
。 x not in s
返回 x in s
取反后的值。 所有内置序列和集合类型以及字典都支持此运算,对于字典来说 in
检测其是否有给定的键。 对于 list, tuple, set, frozenset, dict 或 collections.deque 这样的容器类型,表达式 x in y
等价于 any(x is e or x == e for e in y)
。
对于字符串和字节串类型来说,当且仅当 x 是 y 的子串时 x in y
为 True
。 一个等价的检测是 y.find(x) != -1
。 空字符串总是被视为任何其他字符串的子串,因此 "" in "abc"
将返回 True
。
对于定义了 __contains__()
方法的用户自定义类来说,如果 y.__contains__(x)
返回真值则 x in y
返回 True
,否则返回 False
。
对于未定义 __contains__()
但定义了 __iter__()
的用户自定义类来说,如果在对 y
进行迭代时产生了值 z
使得表达式 x is z or x == z
为真,则 x in y
为 True
。 如果在迭代期间引发了异常,则等同于 in
引发了该异常。
最后将会尝试旧式的迭代协议:如果一个类定义了 __getitem__()
,则当且仅当存在非负整数索引号 i 使得 x is y[i] or x == y[i]
并且没有更小的索引号引发 IndexError
异常时 x in y
为 True
。 (如果引发了任何其他异常,则等同于 in
引发了该异常)。