我想知道是否有人可以解释 Python 的“in”关键字和contains方法之间的区别
我正在使用示例列表并发现了这种行为。这两个应该什么时候使用?如果我使用其中一个,是否可以实现一些效率。
>>> my_list = ["a", "b", "c"]
>>> my_list.__contains__("a")
True
>>> "a" in my_list
True
我想知道是否有人可以解释 Python 的“in”关键字和contains方法之间的区别
我正在使用示例列表并发现了这种行为。这两个应该什么时候使用?如果我使用其中一个,是否可以实现一些效率。
>>> my_list = ["a", "b", "c"]
>>> my_list.__contains__("a")
True
>>> "a" in my_list
True
从文档:
对于列表和元组类型,当且仅当存在索引 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
异常。
使用语句__contains__()
时会调用对象的方法。in
对于列表,这是预定义的,但您也可以定义自己的类,添加__contains__
方法并in
在该类的实例上使用。
您应该使用in
而不是__contains__()
直接调用。
像大多数魔术方法一样,该__contains__
方法并不意味着直接调用。存在的原因__contains__
正是因为您可以编写obj in container
而不是必须使用方法调用语法。所以你应该使用obj in container
.
这样做"a" in my_list
实际上调用__contains__
了my_list
if 定义的方法。
如果__contains__
未定义,则__getitem__
使用。