使用 "is" 标识而不是“==”相等性检查对象是否在可迭代中

Check if object is in an iterable using "is" identity instead of "==" equality

if object in lst:
    #do something

据我所知,当您执行此语句时,它会在内部检查 objectlst 中的每个元素之间的 ==,这将引用 [=15] =] 这两个对象的方法。这可能意味着两个不同的对象是 "equal",如果它们的所有属性都相同,这通常是需要的。

但是,有没有一种方法可以通过 Python 方式实现诸如 in 之类的谓词,其中基础相等性检查是 is - 即我们实际上是在检查两个引用是否指向同一对象?

使用any函数:

if any(x is object for x in lst):
    # ...

如果你想专门使用 is 那么只需使用像这样的过滤器:

filtered_list = filter(lambda n: n is object, list)

3list python 中的成员资格由 __contains__ dunder 方法决定。如果您想使用正常的“in”语法,您可以选择覆盖自定义实现:

class my_list(list):
    def __contains__(self, x):
        for y in self:
            if x is y:
                return True

        return False


4 in my_list([4, [3,2,1]])

>> True

[3,2,1] in my_list([4, [3,2,1]])  # Because while the lists are "==" equal, they have different pointers.

>>> False

否则,我会建议 kaya3 使用生成器检查的答案。