Python列表类包含方法功能

Python列表类包含方法功能,python,list,class,function,contains,Python,List,Class,Function,Contains,list类的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法是检查对象本身是否是list的元素,还是检查list是否包含与给定参数等效的元素 你能给我举个例子来演示吗?这取决于班级如何进行检查。对于内置的列表,它使用=操作符;否则,您无法安全地使用somelist中的“某物” 更具体地说,它检查该项是否等于列表中的一项,因此在内部很可能是ahash(a)==hash(b)比较;如果散列相等,对象本身也可能会被比较 >

list类的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法是检查对象本身是否是list的元素,还是检查list是否包含与给定参数等效的元素


你能给我举个例子来演示吗?

这取决于班级如何进行检查。对于内置的
列表
,它使用
=
操作符;否则,您无法安全地使用somelist中的“某物”

更具体地说,它检查该项是否等于列表中的一项,因此在内部很可能是a
hash(a)==hash(b)
比较;如果散列相等,对象本身也可能会被比较

>>> a = [[]]
>>> b = []
>>> b in a
True
>>> b is a[0]
False
这证明它是一个值检查(至少在默认情况下是这样),而不是身份检查。但是请记住,如果需要,类可以重写
\uuuu包含的
,使其成为身份检查。但是,默认情况下,否。

它检查值

>>> x = 8888
>>> y = 8888
>>> list1 = [x]
>>> print(id(x))
140452322647920
>>> print(id(y))
140452322648016
>>> y in list1
True
Python列表(和元组)首先检查对象本身是否是列表的一个元素(使用
is
操作符),只有当该操作符为False时,才会检查对象是否等于列表中的一个项目(使用
=
操作符)。通过创建不等于自身的对象,可以看到这一点:

>>> class X:
...     def __eq__(self, other):
...             return False
... 
>>> x = X()
>>> x == x
False
但是,由于
x是x
\uuuuuuuuuuuuuuuuuuuu
仍会识别此对象在列表中

>>> x in [1, 'a', x, 7]
True
也就是说,一个lists
\uuuuuuuuuuuuuuuuuuuuuuu包含的方法大致相当于:

def __contains__(self, other):
    return any(other is item or other == item for item in self)
  

这不仅仅是对散列的检查,散列可以是相等的,而值不相等。这是错误的。我刚刚定义了一个
\uuuuuu eq\uuuuu
方法,该方法已被
\uuuu contains\uuuu
中的
非自愿地选择。因此,最有可能的是
list
实现了
a.\uuuu eq\uuuu(b)
比较。不,Python首先执行标识检查,然后仅在标识检查失败时检查值。请参见下面的示例。