通常,关键字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
建议检查是否相等。我想到的唯一理论是,它首先检查身份,如果不是,则检查是否相等。正确吗?
答案 0 :(得分:4)
真正的答案是,in
本身不做任何测试-取决于容器(表达式中in
之后的对象)的实现。 in
实际上会调用container.__contains__(obj)
(如果已定义),否则会调用container.__getitem__(obj)
,并返回结果。容器如何进行测试(身份,相等性,基于月相和船长的生日的奥术算法)是容器的关注重点。
答案 1 :(得分:3)
检查列表上的包容性等同于在每个元素上寻找同一性。
对于容器类型,例如列表,元组,集合,frozenset,dict或collections.deque , 表达式
x in y
等效于any(x is e or x == e for e in y)
(需要注意的是,基于哈希的容器中的对象(如集合)必须具有与其相等性定义一致的哈希实现。)
对于用户定义的容器类型,in
的行为由__contains__
方法确定。