在 python Queue 中添加新元素正在将所有以前的值更改为最新值(实现所有以前的 *** 答案)
Posted
技术标签:
【中文标题】在 python Queue 中添加新元素正在将所有以前的值更改为最新值(实现所有以前的 *** 答案)【英文标题】:Adding new element in python Queue is changing all previous values to the latest value (implementing all previous *** answers) 【发布时间】:2019-08-29 16:09:59 【问题描述】:链接中问题的简短版本 -> https://codereview.stackexchange.com/q/227081/207512
这里是问题的短代码 sn-p
在使用 Python 中的 Branch and Bound 编写 0/1 背包 时,我使用了 queue 模块 中的队列来存储所有节点 ....
检查队列不为空的代码sn-p,然后按代码取值并推送到队列中。
这里,q = queue.Queue()
初始化为一个空节点 u(-1,0,0, 0)。 u2是一个空节点,在每次循环迭代中开始存储节点。
while not q.empty():
u = q.get()
............some code ..........
q.put(u2)
display_queue(q)
..........some code..............
display_queue
定义为:
def display_queue(que):
print("\nThe Nodes in queue currently: ")
for item in list(que.queue):
print("level:, profit:, weight:, bound:".format(item.level, item.profit, item.weight, item.bound))
print()
问题:
如果 q 最初包含 [(0,0,35)]。添加(1,3,70)后,队列变为[(1,3,70),(1,3,70)]。注意:这些是随机值。请不要与输出的数据混淆。
输出样本:假设由于某种原因队列正在增加,经过适当的计算。
我已阅读堆栈溢出中相关问题的答案,例如:Why does adding a new value to list<> overwrite previous values in the list<> 但无法实施建议的更正。
当我尝试实现代码的微型版本时,一切都正确。也就是说,相同的东西(几乎)但不同的输出!
【问题讨论】:
在问题的扩展部分添加了一个简短的可能答案,在这个问题的顶部给出。 【参考方案1】:看起来你从队列中取出东西的速度和放入队列的速度一样快。
while not q.empty():
u = q.get() #removes item from queue
............some code ..........
q.put(u2) #adds item to queue
display_queue(q)
..........some code..............
当您使用 q.get() 从队列中访问数据时,您正在从队列中删除该项目。为什么 list(que.queue) 会给你一个包含三个项目的列表;我不知道。如果您希望您的项目是静态的,您可以使用列表列表。
q_var = []
q_var.append([0,35,3,92])
q_var.append([0,0,0,75])
q_var.append([1,45,5,75])
或者,如果我理解正确,您可以像在 que.queue 中那样访问您的队列,而无需通过不使用 get() 方法来删除项目。
count = 0
while not q.empty():
u = list(q.queue)[count]
............some code ..........
q.put(u2) #adds item to queue
display_queue(q)
..........some code..............
count += 1
这假设您已经在队列中添加了一些东西。无论哪种方式,问题都是 get() 方法,请参阅https://docs.python.org/3/library/queue.html?highlight=queue#module-queue
"Queue.get(block=True, timeout=None)¶ 从队列中移除并返回一个项目。”
【讨论】:
我意识到一个简单的列表实现可以很容易地完成。但我的目的是学习 python 中的队列。我想出了对这个案例的更正,我在帖子顶部给出的扩展链接中发布了该更正。该方法与 get() 本身一起使用。请查看最新编辑(最后输出快照)以增加混淆。 .get() 方法从队列中移除返回的项目。我知道您在 q.queue 中获得了三个项目,但如果您阅读文档,它不会列出 Queue.queue,因为它不打算由最终用户访问。我不确定它为什么会这样,但是如果您真的想了解应该如何使用 Queue,则需要阅读文档。在另一个站点上,您的简短实现不使用 get() 方法。以上是关于在 python Queue 中添加新元素正在将所有以前的值更改为最新值(实现所有以前的 *** 答案)的主要内容,如果未能解决你的问题,请参考以下文章