我想知道是否有人可以解释Python的“in”关键字和 contains 方法之间的区别
我正在使用示例列表并发现此行为。什么时候应该使用两个?如果我使用一个而不是另一个,是否可以实现一些效率。
>>> my_list = ["a", "b", "c"]
>>> my_list.__contains__("a")
True
>>> "a" in my_list
True
答案 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__
。