pythons 关键字 "in" 检查 "is" 还是“==”

does pythons keyword "in" check for "is" or for "=="

关键字 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 的包含等同于在每个元素上查找同一性或相等性。

来自the documentation

For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression x in y is equivalent to any(x is e or x == e for e in y)

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

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

真正的答案是 in 本身不做任何测试 - 这取决于容器(表达式中 in 之后的对象)的实现。 in 实际上会调用 container.__contains__(obj)(如果已定义),否则 container.__getitem__(obj) 和 return 结果。容器如何实现测试(同一性、平等性、基于月相和船长生日的神秘算法)是容器关注的问题。