1

如果我对元素使用任意对象, 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吗?

4

2 回答 2

3

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

于 2012-08-08T12:47:58.453 回答
1

请参阅以下文档object.__contains__(self, item)

调用以实现成员资格测试运算符。如果项目在自身中,则应返回 true,否则返回 false。对于映射对象,这应该考虑映射的键而不是值或键项对。

对于未定义__contains__()的对象,成员资格测试首先尝试迭代 via __iter__(),然后尝试旧的序列迭代协议 via __getitem__(),请参阅语言参考中的此部分。

于 2012-08-08T12:42:43.390 回答