2012-04-18 35 views

回答

9
>>> a = [[]] 
>>> b = [] 
>>> b in a 
True 
>>> b is a[0] 
False 

这证明它是一个值检查(至少默认),而不是身份检查。请记住,如果需要,班级可以重写__contains__()以使其成为身份检查。但是,默认情况下,没有。

+0

这是完美的谢谢你! – 2012-04-18 18:56:59

1

它取决于班级如何做检查。对于内建list,它使用==运算符;否则你不能安全地使用'something' in somelist

更具体地说,它检查项目是否等于列表中的项目 - 因此在内部它最有可能是hash(a) == hash(b)比较;如果哈希值相等,则对象本身也可能被比较。

+1

它不会只是一个哈希检查 - 如果没有值相等,哈希值可以相等。 – 2012-04-18 13:25:14

+0

谢谢你们,这是非常有用的信息! – 2012-04-18 18:56:32

+0

这是错误的。我只是定义了一个'__eq__'方法,它已被(无意识地)由'__contains__'或'in'拾取。因此,很可能'list'实现了'a .__ eq __(b)'比较。 – Atcold 2018-02-13 17:27:16