我想知道有人能否解释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
__contains__()
方法是当你使用 in
语句时调用的对象方法。
对于列表,这是预定义的,但您也可以定义自己的类,添加一个 __contains__
方法并在该类的实例上使用 in
。
您应该使用 in
而不是直接调用 __contains__()
。
和大多数魔术方法一样,__contains__
方法并不是直接调用的。 __contains__
存在的原因恰恰是为了让你可以写 obj in container
而不必使用方法调用语法。 因此,你应该使用 obj in container
。
在我的列表中执行"a" in my_list
实际上调用了my_list
的__contains__
方法(如果已定义)。
如果未定义__contains__
,则使用__iter__
,如果未定义__iter__
,则使用__getitem__
。
__contains__
是一种很好的方式,让某些容器或可迭代对象能够快速检查成员资格,而无需遍历整个序列,例如range()
:
>>> %timeit 10**5 in range(10**9)
159 ns ± 1.16 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
https://docs.python.org/3/reference/expressions.html#membership-test-operations
对于定义了__contains__()
方法的用户自定义类,如果y.__contains__(x)
返回一个真值,x in y
返回True
,否则返回False
。__contains__()
但定义了__iter__()
的用户自定义类,如果在迭代y
时产生了某个值z
,使得表达式x is z or x == z
为真,则x in y
为True
。如果在迭代过程中引发了异常,则就好像in
引发了该异常。__contains__
,那么会使用__iter__
来进行成员检查。当你循环遍历列表时,列表会使用__iter__
返回一个特殊的list_iterator
对象。 - Ashwini Chaudhary