pythons关键字“ in”是否检查“ is”或“ ==“

时间:2019-02-25 13:58:40

标签: python python-3.x identity equality

通常,关键字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

建议检查是否相等。我想到的唯一理论是,它首先检查身份,如果不是,则检查是否相等。正确吗?

2 个答案:

答案 0 :(得分:4)

真正的答案是,in本身不做任何测试-取决于容器(表达式中in之后的对象)的实现。 in实际上会调用container.__contains__(obj)(如果已定义),否则会调用container.__getitem__(obj),并返回结果。容器如何进行测试(身份,相等性,基于月相和船长的生日的奥术算法)是容器的关注重点。

答案 1 :(得分:3)

检查列表上的包容性等同于在每个元素上寻找同一性。

来自the documentation

  

对于容器类型,例如列表,元组,集合,frozenset,dict或collections.deque ,   表达式x in y等效于any(x is e or x == e for e in y)

(需要注意的是,基于哈希的容器中的对象(如集合)必须具有与其相等性定义一致的哈希实现。)

对于用户定义的容器类型,in的行为由__contains__方法确定。