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

问题描述 投票:2回答:2

关键字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

这表明检查平等。我想出的唯一理论是它首先检查身份,如果不是这样,那么检查是否相等。那是对的吗?

python python-3.x identity equality
2个回答
3
投票

检查列表中的包含等同于在每个元素上查找标识或相等性。

来自the documentation

对于容器类型,如list,tuple,set,frozenset,dict或collections.deque,表达式x in y等同于any(x is e or x == e for e in y)

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

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


4
投票

真正的答案是,in本身并没有做任何测试 - 这取决于容器(表达式中in之后的对象)的实现。 in实际上会调用container.__contains__(obj),如果它被定义,否则container.__getitem__(obj),并返回结果。容器如何实现测试(基于月相和船长出生日期的身份,平等,神秘算法)是容器的关注点。

© www.soinside.com 2019 - 2024. All rights reserved.