关键字in
究竟在python中检查了什么?平等,身份,别的什么?
例:
假设我有两个类X和Y与不同的__eq__
运算符
class X:
def __eq__(self,other):
return False
class Y:
def __eq__(self,other):
return True
现在我能做到
a = X()
b = a
k = [a]
b in k # -> True
这表明我的身份检查。 但我也可以这样做
c = Y()
d = Y()
c is d # -> False
l = [d]
c in l # -> True
这表明检查平等。我想出的唯一理论是它首先检查身份,如果不是这样,那么检查是否相等。那是对的吗?
检查列表中的包含等同于在每个元素上查找标识或相等性。
对于容器类型,如list,tuple,set,frozenset,dict或collections.deque,表达式
x in y
等同于any(x is e or x == e for e in y)
(需要注意的是,基于散列的容器中的对象,如集合,必须具有与其相等定义一致的散列实现。)
对于用户定义的容器类型,in
的行为由__contains__
方法确定。
真正的答案是,in
本身并没有做任何测试 - 这取决于容器(表达式中in
之后的对象)的实现。 in
实际上会调用container.__contains__(obj)
,如果它被定义,否则container.__getitem__(obj)
,并返回结果。容器如何实现测试(基于月相和船长出生日期的身份,平等,神秘算法)是容器的关注点。