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 的包含等同于在每个元素上查找同一性或相等性。
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 结果。容器如何实现测试(同一性、平等性、基于月相和船长生日的神秘算法)是容器关注的问题。
关键字 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 的包含等同于在每个元素上查找同一性或相等性。
For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression
x in y
is equivalent toany(x is e or x == e for e in y)
(需要注意的是,基于散列的容器中的对象(如集合)必须具有与其相等性定义一致的散列实现。)
对于用户定义的容器类型,in
的行为由 __contains__
方法确定。
真正的答案是 in
本身不做任何测试 - 这取决于容器(表达式中 in
之后的对象)的实现。 in
实际上会调用 container.__contains__(obj)
(如果已定义),否则 container.__getitem__(obj)
和 return 结果。容器如何实现测试(同一性、平等性、基于月相和船长生日的神秘算法)是容器关注的问题。