Python 中 in 关键字和 __contains__ 的区别

rgk*_*rgk 5 python

我想知道是否有人可以解释Python的“in”关键字和contains方法之间的区别

我正在处理示例列表并发现了这种行为。这两个应该什么时候使用?如果我使用其中一种而不是另一种,是否可以实现一些效率?

    >>> my_list = ["a", "b", "c"]
    >>> my_list.__contains__("a")
    True
    >>> "a" in my_list
    True
Run Code Online (Sandbox Code Playgroud)

Ant*_*hon 8

__contains__()当您使用该语句时,将调用对象的方法in

对于列表,这是预先定义的,但您也可以定义自己的类,添加方法__contains__in在该类的实例上使用。

您应该使用in而不是__contains__()直接调用。


Hen*_*nyH 5

来自文档

对于列表和元组类型,当且仅当存在索引 i 使得 x == y[i] 为 true 时,x in y 才为 true。

字符串类型,x in y 为 true 当且仅当 x 是 y 的子字符串。等效测试是 y.find(x) != -1。

对于定义该方法的用户定义类__contains__(),当且仅当 y 中的 x 为 true 时,x 才y.__contains__(x)为 true。

对于不定义__contains__()但确实定义的用户定义类__iter__(),如果在迭代 y 时生成 x == z 的某个值 z,则 x in y 为 true。如果在迭代期间引发异常,就好像引发了该异常。

最后,尝试旧式迭代协议:如果类定义 __getitem__(),则 y 中的 x 为 true 当且仅当存在非负整数索引 i 使得 x == y[i] 且所有较低整数索引都满足不引发IndexError异常。