如果我对元素使用任意对象, Python 如何__contains__
处理列表?它会恢复给is
运营商吗?或者__eq__
如果提供它是否使用?
一个简单的测试给出了
class Test: pass
print(Test() in [Test()]) # -> no
a=Test()
print(a in [a]) # -> yes
print(a in [Test()]) # -> no
那么我可以假设它使用引用比较is
吗?
如果我对元素使用任意对象, Python 如何__contains__
处理列表?它会恢复给is
运营商吗?或者__eq__
如果提供它是否使用?
一个简单的测试给出了
class Test: pass
print(Test() in [Test()]) # -> no
a=Test()
print(a in [a]) # -> yes
print(a in [Test()]) # -> no
那么我可以假设它使用引用比较is
吗?
list的默认__contains__
实现只是将对象与==
( __eq__
) 运算符进行比较。正是这个运算符,如果没有为类定义,则默认为 is
.
简而言之,“a in lst”相当于:
def contains(obj, lst):
for item in lst:
if obj == lst:
return True
return False
contains(a, lst)
的行为==
会改变是否显式item
实现,否则__eq__
默认为对象标识 ( )。is
请参阅以下文档object.__contains__(self, item)
:
调用以实现成员资格测试运算符。如果项目在自身中,则应返回 true,否则返回 false。对于映射对象,这应该考虑映射的键而不是值或键项对。
对于未定义
__contains__()
的对象,成员资格测试首先尝试迭代 via__iter__()
,然后尝试旧的序列迭代协议 via__getitem__()
,请参阅语言参考中的此部分。