如何在Python中深拷贝队列
你好,如何在Python中深拷贝一个队列?谢谢!
3 个回答
0
你可以用一段简单的代码把一个队列里的成员复制到另一个队列里,代码如下:
# delcare queues
q1 = queue.Queue()
q2 = queue.Queue()
# perform a deep copy ( copy all elemts from q2 to q1 )
while not q2.empty():
q1.put(q2.get())
q2.task_done()
0
我不太清楚你具体需要什么,但你可能会对我在DaniWeb讨论中发布的关于优先队列的代码感兴趣。这个列表很容易通过切片等方式保存副本。
#Python 2.6.5
from random import randint
class Priority:
def __init__(self,prioritylevels=5):
"""The constructor builds list for priority queue which would be used later
"""
self.prioritylevels = prioritylevels
self.pq = [[] for priority in range(self.prioritylevels)] # prioritylevels
def add_to_queue(self, data, priority=None):
"""Add every received in data and use priority parameter or
its priority key to get its priority value (1 == highest) in the global queue
"""
if priority is None: priority = data['priority']-1
else: priority -= 1
if 0 <= priority < self.prioritylevels:
self.pq[priority].append(data)
else: raise ValueError,"Priority level out of bounds: %s" % priority
def get(self):
""" get lowest priority values first from queue """
for priorityevents in self.pq:
while priorityevents:
yield priorityevents.pop(0) ## use list as queue to keep insertion order (remove from front)
def num_items(self):
return sum(len(q) for q in self.pq)
if __name__ == '__main__':
myqueue = Priority(8)
for i in range(100000):
item=randint(0,234234)
if not i % 10000: print i,
priority=(item & 0b111) +1 ## lets three lowest bits decide which priority we give
myqueue.add_to_queue(('Number',item),priority=priority)
print "\n%i items in queues" % myqueue.num_items()
print "Items by priorities"
print '\n'.join("%i: %i" % (priority+1,len(q)) for priority, q in enumerate(myqueue.pq))
print "\nGetting items out of queue in priority order:"
priority=0
for description,i in myqueue.get():
assert (i & 0b111 >= priority), '** Bug ***' ## validity test priority must be same or lower for items
priority = i & 0b111
# empty after get
print "Finished"
print "%i items in queue" % myqueue.num_items()
11
Python中的queue
模块是用来在多个线程之间同步共享数据的。它不是用作数据结构的,并且不支持复制(连浅复制都不行)。
(虽然可以通过使用.get
和.put
来构造多个深复制的队列,但原来的队列会被销毁。)
如果你想要一个队列(或者栈)作为数据结构,可以使用collections.deque
。如果你需要一个优先队列,可以使用heapq
模块。deque支持深复制,而heapq是基于列表的,所以也支持深复制。