Python中的in关键字和__contains__之间的区别

时间:2013-05-14 05:37:03

标签: python

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

您应该使用in而不是直接致电__contains__()

答案 1 :(得分:3)

来自docs

  

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

     

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

     

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

     

对于未定义__contains__()的用户定义的类,但确实如此   如果某个值z与x == z相同,则定义__iter__(),y中的x为真   迭代y时产生。如果在期间引发异常   迭代,就好像在提出异常。

     

最后,尝试旧式迭代协议:如果一个类定义   __getitem__(),y中的x是真的,当且仅当存在非负整数索引i时,x == y [i],并且所有较低的整数索引都是   不提出IndexError例外。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

如果已定义,"a" in my_list实际调用__contains__ my_list方法。

如果未定义__contains__,则使用__getitem__