如何在Python中克隆队列?

Dud*_*ude 6 python

我有一段代码,其中有一个优先级队列,我正在尝试克隆来遍历,

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))
Run Code Online (Sandbox Code Playgroud)

我在网上发现我可以使用copy.copy进行克隆。但是在我的代码中,它不起作用。当我第二次调用prinQueue时,此时优先级队列已空。有人可以指出代码有什么问题吗?

Gij*_*ijs 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

q2 = Q.PriorityQueue()
for i in q1.queue: q2.put(i)
Run Code Online (Sandbox Code Playgroud)

但是,您应该阅读另一个问题,其中有一些很好的答案!特别是,您可能正在寻找一种数据结构,例如collections.deque,不是Queue用于Threads. 了解如何在 python 中深度复制队列


Ofe*_*erP 2

好吧,copy.copy 只是浅复制。正如 Charlie 所说,您无法在 PriorityQueues 上进行深度复制,但我发现由于 pq 由队列实现,因此这可能对您有用:

q2 = Q.PriorityQueue()
q2.queue = copy.deepcopy(q1.queue)
printQueue(q1)
printQueue(q2)
Run Code Online (Sandbox Code Playgroud)