如何在python中克隆一个队列?

ijnw1ujt  于 2023-04-19  发布在  Python
关注(0)|答案(3)|浏览(161)

我有一段代码,我有一个优先级队列,我试图克隆遍历,

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时,优先级队列是空的。有人能指出代码的错误吗?

kmynzznz

kmynzznz1#

如果你复制一个队列,它不会工作。你得到的是完全相同的对象。

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语句实际上耗尽了Queue。你正在复制一个空队列。
如果要复制队列,可以使用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,用于Threads之间的安全通信。参见how to deepcopy a queue in python

bsxbgnwa

bsxbgnwa2#

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

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

ulydmbyx3#

当我需要实现类似的东西时,我确实注意到了一件事,那就是.queue实现了一个类型(collections.deque)的列表。在我的例子中,我想知道列表中的字符串总共有多长,所以我只是迭代了. queue的一个副本。
我可能会直接在_rxBuffer.queue上迭代,但更确切地说,是复制并处理它。

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

相关问题