使用“is”标识而不是“==”等式检查对象是否处于可迭代状态

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

提问人:Josh Katofsky 提问时间:11/6/2019 最后编辑:John KugelmanJosh Katofsky 更新时间:11/6/2019 访问量:162

问:

if object in lst:
    #do something

据我所知,当您执行此语句时,它会在内部检查 和 中的每个元素之间,这将引用这两个对象的方法。这可能意味着两个不同的对象“相等”,如果它们的所有属性都相同,则通常需要这样做。==objectlst__eq__

但是,有没有办法以 Python 方式实现谓词,例如底层相等性检查的位置 - 即我们实际上是在检查两个引用是否指向同一对象?inis

Python 列表 标识 相等

评论


答:

0赞 kaya3 11/6/2019 #1

使用以下函数:any

if any(x is object for x in lst):
    # ...
0赞 William Bright 11/6/2019 #2

如果你想专门使用,那么只需使用过滤器,如:is

filtered_list = filter(lambda n: n is object, list)
1赞 Brian 11/6/2019 #3

3Python 中的列表成员资格由 __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 使用生成器检查的答案。