3

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

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

    >>> my_list = ["a", "b", "c"]
    >>> my_list.__contains__("a")
    True
    >>> "a" in my_list
    True
4

4 回答 4

5

文档

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

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

对于定义__contains__()方法的用户定义类,当且仅当y.__contains__(x)为真时,x in y 为真。

对于未定义__contains__()但确实定义的用户定义类,__iter__()如果在迭代 y 时产生具有 x == z 的某个值 z,则 x in y 为真。如果在迭代过程中引发异常,就好像引发了该异常。

最后,尝试旧式迭代协议:如果一个类定义了 __getitem__(),x in y 为真当且仅当存在一个非负整数索引 i 使得 x == y[i],并且所有低整数索引都如此不引发IndexError异常。

于 2013-05-14T05:43:28.817 回答
4

使用语句__contains__()时会调用对象的方法。in

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

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

于 2013-05-14T05:38:29.817 回答
2

像大多数魔术方法一样,该__contains__方法并不意味着直接调用。存在的原因__contains__正是因为您可以编写obj in container而不是必须使用方法调用语法。所以你应该使用obj in container.

于 2013-05-14T05:39:05.797 回答
1

这样做"a" in my_list实际上调用__contains__my_listif 定义的方法。

如果__contains__未定义,则__getitem__使用。

于 2013-05-14T05:38:51.510 回答