如何在Python中克隆队列?

6

我有一段代码,其中我有一个优先队列,我正在尝试克隆它以进行遍历。

import Queue as Q

import copy

    q1 = Q.PriorityQueue()

    def printQueue(q):
        while not q.empty():
            print (q.get()),
        print ''

    q1.put((5,'s'))
    q1.put((2,'e'))
    q1.put((0,'a'))
    q1.put((0,'z'))
    printQueue(copy.copy(q1)) 
    print 'second'
    printQueue(copy.copy(q1))

我在网上发现可以使用copy.copy进行克隆,但是在我的代码中,它并没有起作用。当我第二次调用prinQueue时,此时优先队列为空。有人可以指出代码哪里出错了吗?


1
从未听说过PriorityQueue,但可以尝试使用copy.deepcopy() - Markus Meskanen
copy.deepcopy不适用于PriorityQueues。请查看此问题:https://dev59.com/MU_Ta4cB1Zd3GeqPA3Wb - Charlie Haley
你读了答案吗?引用你提供的链接中说到:“Python中的队列模块用于在线程之间同步共享数据。它不是一个数据结构,也不支持复制(甚至不支持浅复制)。” - postelrich
通常情况下,如果你需要做除了“放入”和“获取”之外的任何操作,你就不应该使用队列。 - Yash
3个回答

6
如果你复制一个队列,它是不起作用的。你会得到完全相同的对象。
import Queue as Q
import copy
q1 = Q.PriorityQueue()
q2 = copy.copy(q1)
print repr(q2), repr(q1)

>> <Queue.PriorityQueue instance at 0x10568f2d8> <Queue.PriorityQueue instance at 0x10568f368>

从那里开始,你的printQueue语句实际上耗尽了队列。这就是为什么如果你再次复制它,它会为空的原因; 你正在复制一个空队列。

如果你想复制队列,你可以使用Q.get()Q.put(),或者像这样使用Q.queue

q1 = Q.PriorityQueue()
## .. enter items

q2 = Q.PriorityQueue()
for i in q1.queue: q2.put(i)

但是,你应该阅读另一个问题,那里有几个好的答案!特别是,你可能正在寻找一种数据结构,例如 collections.deque,而不是同步的 Queue,它旨在实现线程之间的安全通信。请参见如何在Python中深拷贝队列


2

好的,copy.copy只是浅拷贝。 正如Charlie所说,你不能对PriorityQueues进行深拷贝,但我发现由于pq是由队列实现的,这可能适用于你:

q2 = Q.PriorityQueue()
q2.queue = copy.deepcopy(q1.queue)
printQueue(q1)
printQueue(q2)

0

当我需要实现类似功能时,我注意到.queue实现了一个类型为(collections.deque)的列表。在我的情况下,我想知道列表中字符串的总长度,因此我只是在.queue的副本上进行了迭代。

我可能可以直接在_rxBuffer.queue上进行迭代,但我选择先复制一份并对其进行操作。

    if _rxBuffer.empty():
        tempq = _rxBuffer.queue
        length = 0
        for x in tempq:
            length += len(x)
        print (length)


那不是复制。你直接在_rxBuffer.queue上进行迭代。 - Kelly Bundy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接