在 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 中添加新元素正在将所有以前的值更改为最新值(实现所有以前的 *** 答案)的主要内容,如果未能解决你的问题,请参考以下文章

Python列表知识点讲解

Python 队列

队列Queue

python 队列queue get方法会删除取出的元素吗

在列表中添加元素

Python中queue消息队列模块