如果我对元素使用任意对象, 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__(),请参阅语言参考中的此部分。