我想要一种数据类型,它可以让我有效地跟踪已“添加”到其中的对象,从而允许我测试成员资格。我不需要任何其他功能。
据我所知,Python 没有这样的数据类型。最接近我想要的是集合,但集合将始终存储值(我不需要)。
目前我能想到的最好的方法是获取hash()
每个对象的值并将其存储在一个集合中,但在较低级别,正在计算散列的散列,并将散列字符串存储为一个值。
有没有办法只使用 Sets 的低级查找功能而不实际指向任何东西?
基本上,不,因为正如我在评论中指出的那样,两个不相等的对象完全有可能共享同一个哈希键。
哈希键指向的不是任何东西或一个对象,而是一个包含零个或多个对象的桶。然后,集合实现需要对其中的每一个进行相等比较,以确定对象是否在集合中。
所以你总是需要至少足够的信息来进行相等比较。如果您有非常大的对象,其相等性可以根据其数据的子集来确定,例如 2 或 3 个字段,您可以考虑创建一个仅包含这些字段的新对象并将其存储在集合中而不是整个对象中。
weakref
模块实现了一堆容器,可以在不“存储”值的情况下测试成员资格,缺点是当最后一个对对象的强引用被删除时,对象从弱容器中消失。
如果这对你有用,WeakSet
那就是你想要的。
如果这对您不起作用,那么您似乎需要一个概率性的Bloom 过滤器(有误报),但对于您的目的来说是稳健的(默认情况下没有误报)。
典型的安排是“在过滤器中尝试,如果不是,则为否;如果是,则检查慢速方式,例如文件中的单词列表”