【问题标题】:Equality and identity of Queues队列的平等和身份
【发布时间】:2018-09-11 17:17:33
【问题描述】:

两个queue.Queue 实例会相等还是相同

我有一些代码在其中创建 Queue 实例,附加到 list 并随后删除。

l = []

def example():
    q = Queue()
    l.append(q)
    thingy = q.get()    # wait on background worker thread to put something in queue
    # ... do something with thingy ...
    l.remove(q)

对于(我认为无关紧要的)上下文,更广泛程序中的其他线程会将自己的队列放入列表中,并且还有一个后台工作线程会将对象放入它在列表中找到的队列中。

我了解list.remove() 首先检查身份,然后检查平等。因此,我想知道两个 Queue 实例是否会被评估为相等或相同。

【问题讨论】:

  • 我不这么认为。每个对象都是独一无二的,不是吗?
  • 这很容易测试:Queue() == Queue()False,所以不,他们不会。除非你覆盖 Queue 来改变它的行为。
  • @psinaught 并非每个对象都是唯一的。例如[] == []True
  • @zvone 确实,谢谢。我想我的,也许是非理性的,担心会有一些模糊的情况,两个队列以某种方式变得相等或相同。我注意到__eq__ 没有在 cpython Queue 类中实现,我猜这意味着它总是依赖于对象 ID?
  • 是的,__eq__ 的基本实现是检查身份,即如果两个对象实际上是对同一对象的引用,则它们将相等。

标签: python queue identity equality


【解决方案1】:

如果两个对象的 __eq__ 方法之一评估为 True,则两个对象相等 (==)。

如果两个对象实际上是位于相同内存地址的相同对象,则它们是相同的 (is)。

如果一个类(或其父类)没有实现__eq__ 方法,那么相等比较就会退回到身份比较。

The Queue class does not implement __eq__ 所以两个 Queue 对象只有在它们实际上相同时才会相等

这可以通过Queue() == Queue()False 的事实来证明。

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 2018-11-29
    • 2020-05-04
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多